如何检查两种类型是否具有相同的位模式和类型?

时间:2014-10-29 23:53:35

标签: c++

假设我有3种类型,AB以及int。我想知道这些类型的实例化的某些组合是否具有相同的位内容。我对AB实际包含的内容一无所知,我也不在乎。我只是想知道它们是否是相同类型并且具有相同的位模式。

例如:

struct A { int a{2}; };
struct B
{
  B()
  {
    int x = 2;
    b = *reinterpret_cast<double*>(&i);
  }
  double b;
}

template <typename T1, typename T2>
bool IsSame(const T1& t1, const T2& t2)
{
  return t1 == t2; // this won't work... No '==' operator!
};

int main()
{
  A a;
  B b;
  A a2;
  a2.a = 1;

  int c = 2;

  IsSame(a, a); // this will be true
  IsSame(a, b); // this will be false even though a and b probably have the same bit pattern.
  IsSame(a, a2); // false because a2 contains a "2"
  IsSame(a, c); // false because they're different types
}

如何实施IsSame

1 个答案:

答案 0 :(得分:3)

要检查两个对象是否具有相同的表示,您可以编写:

if ( 0 == std::memcmp(&t1, &t2, sizeof t1) )

请注意,对象的某些位可能不参与其值表示;和/或对于相同的值可能存在多种可能的表示;因此使用此方法可能会显示不相等的通过operator==的对象。

您还应该添加一个sizeof t1 == sizeof t2的支票,这可以在编译时完成。