これらのタイプがあるとしましょう:
struct A {
int a;
};
struct B {
int b;
};
struct C : public A, public B {
int c;
};
ポインターは、実際のアドレスをまったく調整せずにポインターにC*
キャストできます。A*
しかし、C*
が にキャストされるB*
と、値は変更されなければなりません。私が持っている 2 つの関連する型を、アドレスを変更せずに互いにキャストできるようにしたいと思います (つまり、多重継承がないか、基底クラスが派生クラスの最初の基底であること)。これは実行時にチェックできます。
assert(size_t(static_cast<A*>((C*)0xF000) == 0xF000);
assert(size_t(static_cast<B*>((C*)0xF000) != 0xF000);
それはうまくいきます。しかし、この情報はコンパイル時にわかっているので、コンパイル時にアサートする方法を探しています。上記を静的アサートに変換する明らかな方法 (たとえば、g++ 4.2.2 で「整数型または列挙型以外の型へのキャストは定数式に表示できません」というエラーassert
を与えると置き換えます)。BOOST_STATIC_ASSERT
携帯性はあまり重要ではありません。gcc 拡張機能やハッキーなテンプレート トリックを使用しても問題ありません。
更新:以前にほぼ同じ質問がされていることがわかりました: C++, statically detect base classes with different address? . 使用offsetof()
することも唯一の有用な提案です。