![](/img/trans.png)
[英]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.