簡體   English   中英

有沒有辦法進行編譯時檢查,在 operator== 中比較 class 的所有成員

[英]Is there a way to have a compile time check, that all members of a class are compared within operator==

我想知道 C++ 中是否有一種方法可以進行編譯時檢查,以驗證 class 的所有成員變量是否通過operator==進行比較? 如果有的話,有一種方法可以顯式地忽略對某些成員的這個約束也是有用的。

這對於我的用例很有用,其中在我們的開發過程中有一個數據結構隨着時間的推移而變化,並且已經多次發生過調整現有operator==的情況。 這是一個無聲的錯誤,它會導致我們稱之為“誤報行為”,這很難找到。

任何信息表示贊賞。 也許是解決問題的替代方法,或者解釋為什么這個編譯時間檢查可能是不可能的。

編輯:遺憾的是我正在使用 C++17 並且在不久的將來無法更新到 C++20。

使用 C++20,假設所有 class 成員本身==可比較,您可以簡單地提供默認定義:

class C {
    // members
public:
    bool operator==(C const&) const = default;
};

當您更新 class 時,默認操作員將自動選擇新成員。


至於忽略比較中的成員。 這總是有點牽扯,因為有時可能會出現默認操作。 一種方法是使用嵌套的 class

class C {
    // members
    struct NoEqCompare {
       mutable std::mutex mut; // A member you may want to omit.
       bool operator==(NoEqCompare const&) const { return true; }
    } eqIgnore;
public:
    bool operator==(C const&) const = default;
};

std::tie在每個運算符的基礎上添加您想要的成員的舊技巧不同,如果我們需要將更多運算符添加到組合中,然后混合和匹配成員,這可能會更加棘手. 權衡您的選擇。

這里的根本問題是您不能迭代 class 成員。

快速的解決方案是將在operator==中起作用的所有成員打包到std::tuple中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM