c++ - 有没有办法进行编译时检查,一个类的所有成员都在 operator== 中进行比较

我想知道在 C++ 中是否有一种方法可以进行编译时检查,验证一个类的所有成员变量是否由 operator== 进行比较?如果有的话,有一种方法可以显式忽略对某些成员的这种限制。

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

欢迎提供任何信息。也许可以使用其他方法来解决问题,或者解释为什么无法进行此编译时检查。

编辑:遗憾的是我正在使用 C++17,并且在不久的将来没有办法更新到 C++20。

最佳答案

在 C++20 中,假设你所有的类成员本身都是 == 可比较的,你可以简单地提供一个默认定义:

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

当您更新您的类(class)时,默认运算符(operator)将自动接收新成员。


就忽略比较中的成员而言。这总是有点复杂,因为默认操作有时会涉及到。一种方法是使用嵌套类

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 的老把戏不同——在每个运算符的基础上加入你想要的成员,如果我们需要向其中添加更多运算符,这可能会有点棘手混音,然后混搭成员。权衡您的选择。

https://stackoverflow.com/questions/66635911/

相关文章:

javascript - 我想从数组中返回一个 JSON 对象

python - Where 函数忽略 Nan

webpack - 为什么 Tailwind 中的清除选项不适用于 Webpack

flutter - 如何将 Flutter 桌面应用程序发布到 Windows 应用商店

vue.js - Primevue Grid 和 Flex 布局无法正确呈现

regex - 如何从日志文件中 grep 错误但过滤掉错误警报?

delphi - 我们可以在 Sydney 的手机中安全地使用 ansiString 吗?

python - Pandas 根据条件转置

kubernetes - 将单独的环境变量传递给 statefulset pod

r - 将唯一数字添加到字符串