[英]How to do a compile time type_check and only compile parts of my class if my class members' type matches the types?
[英]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.