假设我有3种类型,A
和B
以及int
。我想知道这些类型的实例化的某些组合是否具有相同的位内容。我对A
或B
实际包含的内容一无所知,我也不在乎。我只是想知道它们是否是相同类型并且具有相同的位模式。
例如:
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
?
答案 0 :(得分:3)
要检查两个对象是否具有相同的表示,您可以编写:
if ( 0 == std::memcmp(&t1, &t2, sizeof t1) )
请注意,对象的某些位可能不参与其值表示;和/或对于相同的值可能存在多种可能的表示;因此使用此方法可能会显示不相等的通过operator==
的对象。
您还应该添加一个sizeof t1 == sizeof t2
的支票,这可以在编译时完成。