在C ++中没有重载operator ==的struct成员相等

时间:2017-01-06 04:20:45

标签: c++ templates generics struct equality

是否可以定义某种可以为结构创建通用可比运算符的模板?

例如,这样的事情可能吗?

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);
}

所有这些都是结构的字段比较。您可以假设所有字段都是基本类型或重载operator ==。

我有很多像这样的结构,如果我可以把它放在一个模板或者用于比较的东西而不是为每个结构定义一个运算符==,它将节省我很多时间。谢谢!

更新

C ++似乎无法做到这一点。我想知道为什么这个被Clas提案投票,如果有人有理由让我们知道!

对于使用基本类型的解决方案,请参阅R Sahu的解决方案。

3 个答案:

答案 0 :(得分:1)

  

是否可以定义某种可以为结构创建通用可比运算符的模板?

如果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可以比较两个对象。

答案 1 :(得分:1)

看看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) ? "==" : "!=") << " s2\n";
    std::cout << "s1 " << ((s1 == s3) ? "==" : "!=") << " s3\n";
}

// Produces
// s1 == s2
// s1 != s3

答案 2 :(得分:0)

你要做的是遍历各种结构,比较成员是我的理解。

Iterating over a struct

这似乎不能用标准的c ++完成,但该线程提供了一些关于使用哪些库的想法。

从您的问题中不清楚所有结构是否具有相同的格式,我假设它们没有。