1

ミックスインが次のように定義されている場合...

template<class T> class Mixin : public T
{
    // mixin methods and members
};

...そして、T が非ポリモーフィック クラスであることを宣言します...

Mixin<NonPoly> mixin;

..そして、それへの基本クラスのポインタを持っています...

NonPoly* nonPolyPtr = &mixin;

...後で nonPolyPtr が Mixin タイプを指していることを確認するにはどうすればよいですか?

dynamic_cast<Mixin*>(nonPolyPtr)

基本クラスは非ポリモーフィックであるため、上記はコンパイルされません。

Boost には役立つ特性クラスがいくつかあるのを見ましたが、見落としているより簡単な解決策があることを願っています。

4

2 に答える 2

2

あなたは間違った要件を見ていると思います。ここでキャストを行う必要はありませんが、コードの再構築が必要になる場合があります。mixin を作成するクラス A と NonPoly を使用する B の関係がある場合、B に NonPoly ポインタを渡し、A で mixin を直接使用するだけです。もう一度取り戻す。それ以上のクラスがある場合は、mixin を知っている人と NonPoly を知っている人に分けて、同じ関係にします。

そもそもこれが当てはまる場合、ミックスインの設計は適切なアプローチではない可能性が非常に高くなります。多くの場合、単純な封じ込めが必要な場合に mixin が使用されます。上記の A と B の例では、Mixin クラスがある場合があります。

template <typename T>
class Mixin
{
  T * GetObject()
  { return & t_; }

  // other methods that use t_
private:
  T t_;
};

操作が必要なときにオブジェクトを渡すだけです。または、もっと一般的なのは、サードパーティのライブラリに T を渡すだけの場合、mixin はまったく必要ありません。封じ込めは最善ではないかもしれません。カプセル化を維持するための最善の方法は、そのパブリック インターフェイスとパブリック サード パーティ ルーチンを介して型 T を操作できる場合、常にファイル スコープ アルゴリズムを記述することです。

型情報を失い、後で回復する必要があると考える理由を説明できれば、所有権を再構築してそれが発生する必要がないようにする方法をより明確に示すことができるかもしれませんが、この型情報はランタイムを決して離れないためです(キャストしようとしているので-あなたの質問は、シリアル化されていないことなどを意味しています)、その型情報が最初に失われない設計があることを保証できます。

于 2011-09-02T03:55:22.070 に答える
-1

そのタイプが確かな場合はstatic_cast、ダウンキャストに使用してください。また、キャストでテンプレートパラメータを指定する必要がありますMixin<NonPoly>*

template<class T>
class Mixin : public T
{
    // mixin methods and members
};

class NonPoly {
};

int main() {
  Mixin<NonPoly> mixin;
  NonPoly* nonPolyPtr = &mixin;

  Mixin<NonPoly>* mixinPtr = static_cast<Mixin<NonPoly>*>(nonPolyPtr);
}
于 2011-09-02T03:03:22.603 に答える