C++ gtest有比较二进制的东西吗?

C++ gtest有比较二进制的东西吗?,c++,binary,compare,googletest,C++,Binary,Compare,Googletest,是否具有对给定对象的二进制表示进行操作的比较函数 我有两个相同类型的struct-对象,但没有比较函数。struct是一种普通的旧数据类型(POD),因此二进制比较可以工作 我需要像这样的东西: struct A{ int some_data; }; TEST(test, case){ A a1{0}, a2{1}; EXPECT_BINARY_EQ(a1, a2); } 在C++中,用GTest.最简单的方法是什么? < P>我的建议是基于: 您可以使用(从元组标题)在

是否具有对给定对象的二进制表示进行操作的比较函数

我有两个相同类型的
struct
-对象,但没有比较函数。
struct
是一种普通的旧数据类型(POD),因此二进制比较可以工作

我需要像这样的东西:

struct A{
  int some_data;
};

TEST(test, case){
    A a1{0}, a2{1};
    EXPECT_BINARY_EQ(a1, a2);
}

在C++中,用GTest.最简单的方法是什么?

< P>我的建议是基于:

您可以使用(从元组标题)在类上定义
运算符==


我的建议基于:

您可以使用(从元组标题)在类上定义
运算符==

我当前的解决方案:

#include <algorithm>

template < typename T >
bool binary_eq(T const& lhs, T const& rhs){
    auto lhs_i = reinterpret_cast< char const* >(&lhs);
    auto rhs_i = reinterpret_cast< char const* >(&rhs);
    return std::equal(lhs_i, lhs_i + sizeof(T), rhs_i);
}
#包括
模板
布尔二进制均衡器(T常量和lhs、T常量和rhs){
自动lhs_i=重新解释投射(&lhs);
自动rhs_i=重新解释投射(&rhs);
返回标准::相等(lhs_i、lhs_i+sizeof(T)、rhs_i);
}
编辑:

多亏了Erik Alapäa和Frank,我明白这不能通用,因为
struct
成员的填充。在我的特定情况下,它确实起作用,因为所有成员都是双重的。

我当前的解决方案:

#include <algorithm>

template < typename T >
bool binary_eq(T const& lhs, T const& rhs){
    auto lhs_i = reinterpret_cast< char const* >(&lhs);
    auto rhs_i = reinterpret_cast< char const* >(&rhs);
    return std::equal(lhs_i, lhs_i + sizeof(T), rhs_i);
}
#包括
模板
布尔二进制均衡器(T常量和lhs、T常量和rhs){
自动lhs_i=重新解释投射(&lhs);
自动rhs_i=重新解释投射(&rhs);
返回标准::相等(lhs_i、lhs_i+sizeof(T)、rhs_i);
}
编辑:

多亏了Erik Alapäa和Frank,我明白这不能通用,因为
struct
成员的填充。在我的特定情况下,它确实起作用,因为所有成员都是双重的。

如果您可以使用库:

如果您可以使用该库:


请记住,结构中不同的非零填充至少会使memcmp()失败。为什么不为结构提供
运算符==
?如果没有私有成员,您可以在UT中作为一个自由函数进行比较。@Yksisarvinen:简单,我只需要在单元测试中进行比较;-)@Erik Alapääa:我只在单元测试中使用比较,并且始终保持相同的对齐方式。在这种情况下没什么可担心的;-)请尝试
magic\u get
记住,结构中不同的非零填充至少会使memcmp()失败。为什么不为结构提供
运算符==
?如果没有私有成员,您可以在UT中作为一个自由函数进行比较。@Yksisarvinen:简单,我只需要在单元测试中进行比较;-)@Erik Alapääa:我只在单元测试中使用比较,并且始终保持相同的对齐方式。在这种情况下没什么可担心的;-)试试
magic\u get
谢谢你的回答,但这不是我想要的。我只需要在单元测试中进行比较,不想为我的每个结构提供相等的运算符。谢谢你的回答,但这不是我想要的。我只需要在单元测试中进行比较,不想为我的每个结构提供相等的运算符。这只能保证对紧密压缩的结构有效。关于双精度:注意,有多字节表示,可以表示相同的数值
operator=(double,double)
说明了这一点,因此即使类型是POD,您的函数也不等同于一个成员对一个成员的比较。这只能保证适用于紧密压缩的结构。关于double:请注意,有多字节表示法可以表示相同的数值
operator=(double,double)
说明了这一点,因此您的函数并不等同于一个成员对一个成员的比较,即使类型是POD。@BenjaminBuch
operator=
可以在结构之外定义。(例如,在您的测试cpp中)。现在可以在测试中使用ASSERT_EQ。我修改了这个例子来说明这一点。@BenjaminBuch
操作符==
可以在结构之外定义。(例如,在您的测试cpp中)。现在可以在测试中使用ASSERT_EQ。我修改了这个例子来说明这一点。
// requires: C++14, MSVC C++17
#include <iostream>
#include "boost/pfr/precise.hpp"

struct my_struct
{ // no operators defined!
    int    i;
    char   c;
    double d;
};

bool operator==(const my_struct& l, const my_struct& r)
{
    using namespace boost::pfr::ops; // out-of-the-box operators for all PODs!

    return boost::pfr::structure_tie( l ) == boost::pfr::structure_tie( r );
}

int main()
{
    my_struct s{ 100, 'H', 3.141593 };
    my_struct t{ 200, 'X', 1.234567 };

    std::cout << ( s == s ) << '\n' << ( s == t ) << "\n";
}
TEST( Test_magic_get, Test_magic_get )
{
    my_struct s{ 100, 'H', 3.141593 };
    my_struct t{ 200, 'X', 1.234567 };

    //ASSERT_EQ( s, t );
    ASSERT_EQ( s, s );
}