在C ++中没有重载operator ==的结构成员相等
是否可以定义某种可以为结构创建通用可比操作符的模板?
例如,这可能是这样的吗?
struct A
{
int one;
int two;
int three;
};
bool AreEqual()
{
A a {1,2,3};
A b {1,2,3};
return ComparableStruct<A>(a) == ComparableStruct<A>(b);
}
所有这些都是通过结构的字段比较来进行的。 您可以假定所有字段都是基本类型或者运算符==重载。
我有很多像这样的结构,如果我可以将它放在模板或某些用于比较的内容中,而不是为每个结构定义一个运算符==,它都会为我节省大量时间。 谢谢!
更新
看来这对于C ++来说是不可能的。 我想知道为什么这是C ++提案的投票结果,如果有人有理由让我们知道!
对于适用于基本类型的解决方案,只能看到R Sahu的解决方案。
是否可以定义某种可以为结构创建通用可比操作符的模板?
如果struct
没有填充,可以使用:
template <typename T>
struct ComparableStruct
{
ComparableStruct(T const& a) : a_(a) {}
bool operator==(ComparableStruct const& rhs) const
{
return (std::memcmp(reinterpret_cast<char const*>(&a_), reinterpret_cast<char const*>(&rhs.a_), sizeof(T)) == 0);
}
T const& a_;
};
更好的是,你可以使用函数模板。
template <typename T>
bool AreEqual(T cost& a, T const& b)
{
return (std::memcmp(reinterpret_cast<char const*>(&a), reinterpret_cast<char const*>(&b), sizeof(T)) == 0);
}
如果struct
有任何填充,则不能保证使用std::memcmp
可以用来比较两个对象。
看看https://github.com/apolukhin/magic_get。 这个库可以为一些相当简单的结构自动生成比较运算符。
#include <iostream>
#include <boost/pfr/flat/global_ops.hpp>
struct S {
char c;
int i;
double d;
};
int main() {
S s1{'a', 1, 100.500};
S s2 = s1;
S s3{'a', 2, 100.500};
std::cout << "s1 " << ((s1 == s2) ? "==" : "!=") << " s2n";
std::cout << "s1 " << ((s1 == s3) ? "==" : "!=") << " s3n";
}
// Produces
// s1 == s2
// s1 != s3
你要做的是遍历各种结构和比较成员是我的理解。
迭代结构
这看起来不能用标准的c ++来完成,但该线程提供了一些关于使用哪些库的想法。
从你的问题来看,并不清楚所有的结构是否具有相同的格式,我假设它们没有。
链接地址: http://www.djcxy.com/p/73777.html上一篇: Struct member equality without overloading operator== in C++
下一篇: Why is operator == not automatically synthesized for nested classes in C++