有没有办法进行编译时检查,在 operator== 内比较类的所有成员

mar*_*o.b 2 c++ operator-overloading comparison-operators c++17

我想知道 C++ 中是否有一种方法可以进行编译时检查,以验证类的所有成员变量是否都通过operator==? 如果有的话,有一种方法可以显式地忽略某些成员的这个约束也是很有用的。

这对于我的用例很有用,其中在我们的开发过程中有一个数据结构随着时间的推移而变化,并且已经多次发生调整现有的operator==被遗忘的情况。这是一个无声的错误,导致我们称之为“误报行为”,这很难找到。

任何信息表示赞赏。也许解决问题的替代方法,或者解释为什么这个编译时检查可能是不可能的。

编辑:可悲的是,我正在使用 C++17,并且在不久的将来无法更新到 C++20。

Sto*_*ica 5

使用 C++20,假设您所有的类成员本身都==具有可比性,您可以简单地提供一个默认定义:

class C {
    // members
public:
    bool operator==(C const&) const = default;
};
Run Code Online (Sandbox Code Playgroud)

当您更新类时,默认操作员将自动选择新成员。


至于在比较中忽略成员。这总是会涉及到一些问题,因为有时会出现默认操作。一种方法是使用嵌套类

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;
};
Run Code Online (Sandbox Code Playgroud)

与在std::tie每个运算符的基础上添加您想要的成员的老技巧不同,如果我们需要将更多运算符添加到组合中,然后混合和匹配成员,这可能会变得更加棘手。权衡你的选择。