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

How do I check if two types have the same bit pattern and type?

本文关键字:类型 模式 是否 何检查 检查 两种      更新时间:2023-10-16

假设我有三种类型,ABint。我想知道这些类型的实例化的某些组合是否具有相同的位内容。我对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

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

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

请注意,对象的某些位可能不参与其值表示;和/或对于相同的值可以存在多个可能的表示;因此通过CCD_ 7比较相等的对象使用该方法可能看起来不相等。

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