0

我经常在有 defaulted<=>或 defaulted的结构/类上编写测试期望==

问题是,当期望失败时,我不知道是什么成员导致了失败(通常我使用EXPECT_EQso ==returned false)。原因是<=>/==基本上是编译器生成的黑匣子。

我知道 C++ 没有反射,但是是否有一些技巧可以让两个实例之间不匹配?

为了清楚起见,这里是一个简短的示例(在实际代码中,数据通常要复杂得多,并且从查看不匹配的值来看并不明显):

#include <iostream>

struct A{
    int x;
    int y;
    bool operator == (const A& ) const = default;
};

struct B {
    A a;
    int z;
    bool operator == (const B& ) const = default;
};

int main() {
    B b1{.a{.x=1, .y=2}, .z{3}};
    B b2{.a{.x=1, .y=8472}, .z{3}};
    std::cout << (b1 == b2) << std::endl;
    std::cout << "missmatch at member" /*magic missing*/ <<  std::endl;
}

我知道 protobuf 有反射,并且我可以使用 Boost.Describe 用元数据装饰我的结构,这个问题是关于纯粹的 ISO C++ 解决方案,而不对结构进行任何更改。

另外我知道我可以手动比较成员,这就是我现在遇到这个问题时所做的(或者只是查看结构的值),但我想“自动化”这个过程。

4

0 回答 0