Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 结构的泛型比较运算符_C++_C++17_Stdtuple - Fatal编程技术网

C++ 结构的泛型比较运算符

C++ 结构的泛型比较运算符,c++,c++17,stdtuple,C++,C++17,Stdtuple,在我的许多单元测试中,我需要比较只有数据成员的简单结构的内容: struct Object { int start; int stop; std::string message; } 现在,如果我想写这样的东西: CHECK(object1==object2); 我始终必须实施: bool operator==(const Object& lhs, const Object& rhs) { return lhs.start==rhs.start &&

在我的许多单元测试中,我需要比较只有数据成员的简单结构的内容:

struct Object {
  int start;
  int stop;
  std::string message;
}
现在,如果我想写这样的东西:

CHECK(object1==object2);
我始终必须实施:

bool operator==(const Object& lhs, const Object& rhs) {
   return lhs.start==rhs.start && lhs.stop==rhs.stop && lhs.message=rhs.message;
}
编写所有这些比较函数变得单调乏味,但也容易出错。试想一下,如果我向对象添加了一个新的数据成员,但比较运算符不会被更新,将会发生什么

然后我想起了我在Haskell和magic
deriving(Eq)
指令中的知识,它只是免费生成一个健全的比较函数

<>如何,我能在C++中得到类似的东西吗?< /P> 幸运的是,我发现C++17附带了一个通用的
操作符==
,并且借助
std::make_tuple
,每个结构都可以轻松地转换为
std::tuple

因此,我大胆地尝试了以下方法:

#include <tuple>
#include <iostream>
#include <tuple>

template<typename T>
bool operator==(const T& lhs, const T& rhs)
{
    auto leftTuple = std::make_tuple(lhs);
    auto rightTuple = std::make_tuple(rhs);

    return leftTuple==rightTuple;
}

struct Object
{
    std::string s;
    int i;
    double d;
};

int main(int arg, char** args)
{
    std::cout << (Object{ "H",1,2. } == Object{ "H",1,2. }) << std::endl;
    std::cout << (Object{ "A",2,3. } ==  Object{ "H",1,2. }) << std::endl;
    return EXIT_SUCCESS;
}
#包括
#包括
#包括
模板
布尔运算符==(常数T和lhs、常数T和rhs)
{
自动左元组=std::make_元组(lhs);
自动右元组=std::make_元组(rhs);
返回leftTuple==rightTuple;
}
结构对象
{
std::字符串s;
int i;
双d;
};
int main(int参数,字符**args)
{

std::coutNo,因为比较元组还原为比较元组的元素,所以
leftTuple==rightuple
尝试比较两个
对象
s,这是不可能的

借助于
std::make_tuple

不,您只需要得到一个包含一个元素的
元组,即struct

诀窍是使用
std::tie

std::tie(lhs.mem1, lhs.mem2) == std::tie(rhs.mem1, rhs.mem2)
但这与您最初的解决方案存在相同的问题。不幸的是,C++17没有任何工具可以避免此问题。您可以编写一个宏:)。但在C++20中,您可以执行以下操作:

struct Object
{
    std::string s;
    int i;
    double d;
    bool operator==(const Object &) const = default;
};

这将为
对象生成正确的比较运算符

谢谢。我对
std::make\u tuple
可以做什么有一个误解。似乎,我在寻找与
std::make\u from\u tuple
相反的东西,以使其工作。@Aleph0是的,你需要类似于
create\u tuple\u from
的东西,但这不是不幸的是,没有反射就可能。你真的需要这个sctuct吗?你能用一个元组来代替吗?
struct Object
{
    std::string s;
    int i;
    double d;
    bool operator==(const Object &) const = default;
};