作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想知道在 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
的老把戏不同——在每个运算符的基础上加入你想要的成员,如果我们需要向其中添加更多运算符,这可能会有点棘手混音,然后混搭成员。权衡您的选择。
关于c++ - 有没有办法进行编译时检查,一个类的所有成员都在 operator== 中进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66635911/
我是一名优秀的程序员,十分优秀!