假设我有这些类型:
struct A {
int a;
};
struct B {
int b;
};
struct C : public A, public B {
int c;
};
C*
可以将指针强制转换为指针A*
,而无需调整实际地址。但是当C*
被转换为时B*
,值必须改变。我想确保我拥有的两种相关类型可以相互转换而不改变地址(即没有多重继承,或者基类是派生类的第一个基类)。这可以在运行时检查,例如像这样
assert(size_t(static_cast<A*>((C*)0xF000) == 0xF000);
assert(size_t(static_cast<B*>((C*)0xF000) != 0xF000);
这样可行。但是这些信息在编译时是已知的,所以我正在寻找一种方法来对其进行编译时断言。将上述转换为静态断言的明显方法(例如,用 g++ 4.2 替换assert
为BOOST_STATIC_ASSERT
错误“转换为整数或枚举类型以外的类型不能出现在常量表达式中”。
便携性不是很重要。使用 gcc 扩展或 hacky 模板技巧都可以。
更新:发现之前也问过几乎一样的问题:C++,静态检测不同地址的基类?. 使用offsetof()
也是那里唯一有用的建议。