如何检查两种类型是否具有相同的位模式和类型
How do I check if two types have the same bit pattern and type?
假设我有三种类型,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
?
要检查两个对象是否具有相同的表示,可以编写:
if ( 0 == std::memcmp(&t1, &t2, sizeof t1) )
请注意,对象的某些位可能不参与其值表示;和/或对于相同的值可以存在多个可能的表示;因此通过CCD_ 7比较相等的对象使用该方法可能看起来不相等。
您还应该添加一个sizeof t1 == sizeof t2
的检查,这可以在编译时完成。
相关文章:
- avrogencpp能为模式中的每种类型生成单独的头文件吗
- 如何设计具有不同类型的通知和观察器的观察者模式?
- 设计帮助 - 为不同类型的消息处理通用接口的设计模式
- 正则表达式以匹配数字的重复模式,后跟任何类型的分隔符?
- 使用访问者模式检查派生类类型?
- C++ 通用 lambda:模式类型推导
- CRTP 模式 但是在数据结构中存储非同构类型
- 正确的方法或设计模式,以简化类中的“operatorX”函数,以按给定顺序比较相同类型的属性
- C++模板元编程:如何在表达式模式中推断类型
- 如何使用C++模板魔术来对类型进行模式匹配
- 返回不同类型/类的方法的设计模式
- 类型擦除和一种模板方法模式
- 生成器模式实现中的不完整类型错误
- 在使用分段寻址模式的 16 位系统上,"size_t"、"uintptr_t"、"intptr_t"和"ptrdiff_t"类型的实际大小是多少?
- 在Qt中注册元类型的模式
- 具有类型信息的观察者模式(C++)
- 用于将静态字符串常量与类型相关联的类型特征模式
- 返回一组数据类型之一的最佳模式
- 用于在不使用 RTTI 的情况下缓存不同派生类型的设计模式
- C++:直接使用派生类型的模板方法模式