我经常在有 defaulted<=>
或 defaulted的结构/类上编写测试期望==
。
问题是,当期望失败时,我不知道是什么成员导致了失败(通常我使用EXPECT_EQ
so ==
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++ 解决方案,而不对结构进行任何更改。
另外我知道我可以手动比较成员,这就是我现在遇到这个问题时所做的(或者只是查看结构的值),但我想“自动化”这个过程。