2

複数のベースを持つ派生クラスがある場合、各ベースの各 this ポインターは、1 つを除いて、派生オブジェクトの this ポインターとは異なります。継承階層に 2 つの型がある場合、それらが同じ this ポインターを共有しているかどうかをコンパイル時に検出したいと考えています。このようなものは機能するはずですが、機能しません:

BOOST_STATIC_ASSERT(static_cast<Base1*>((Derived *)0xDEADBEEF) == (Derived*)0xDEADBEEF);

それは「整数定数式」である必要があり、標準に従って整数キャストのみが許可されているためです(仮想継承が使用されていない場合、コンパイル時の情報のみが必要なため、これはばかげています)。結果を整数のテンプレート パラメータとして渡そうとすると、同じ問題が発生します。

私ができる最善のことは、起動時にチェックすることですが、コンパイル中に情報が必要です (いくつかの深いテンプレートハッカーを機能させるため)。

4

6 に答える 6

2

私はあなたが望まないことをチェックする方法を知りませんが、空の基本クラスが存在する場合、あなたの仮定は誤りであることに注意してください。タイプが異なる限り、オブジェクトの先頭からのオフセットをいくつでも共有できます。

于 2009-07-15T14:19:59.013 に答える
2

このまったく同じ問題を解決しようとしています。基本クラスのレイアウトの先頭にあるメンバー変数がわかっている場合に機能する実装があります。たとえば、メンバー変数「x」が各クラスの先頭に存在する場合、次のコードは、派生クラスのレイアウトから特定の基本クラスのレイアウトのバイト オフセットを生成するために機能します: offsetof(derived, base2::x)。

の場合:
struct base1 { char x[16]; };
struct base2 { int x; };
struct derived : public base1, public base2 { int x; };
static const int my_constant = offsetof(derived, base2::x);

コンパイラは、私のアーキテクチャ (x86_64) の my_constant に "16" を適切に割り当てます。

問題は、基本クラスのレイアウトの先頭にあるメンバー変数がわからない場合に "16" を取得することです。

于 2010-09-02T02:25:27.607 に答える
1

クラスにはthisポインタがありません-クラスのインスタンスにはあります。どのように派生したかに関係なく、インスタンスごとに異なります。

于 2009-07-15T14:35:37.490 に答える
1

使用するのはどうですか

BOOST_STATIC_ASSERT(boost::is_convertible<Derived*,Base*>::value)

次の場所に記載されているように...

http://www.boost.org/doc/libs/1_39_0/doc/html/boost_staticassert.html

http://www.boost.org/doc/libs/1_38_0/libs/type_traits/doc/html/boost_typetraits/reference/is_convertible.html

于 2009-07-15T14:48:52.557 に答える
1

そもそもこのオフセットが定数であるかどうかさえわかりません。そうでないことを示唆する規範的な文言はありますか?

非 const オフセットは、仮想継承がない場合に実装するのが非常に難しく、起動しても意味がないことに同意します。それは要点を超えています。

于 2009-07-15T14:27:25.757 に答える