1

使用を提案するこの問題の解決策を見てきました

if( dynamic_cast<DerviedType1*>( base ) ){
    // Do something
}
else if( dynamic_cast<DerviedType2*>( base ) ){
    // Do something else
}
else if( dynamic_cast<DerviedType3*>( base ) ){
   // Do another thing
}
// and so on

decltype機能的ではありますが、このソリューションはエレガントとはほど遠いものであり、またはの行に沿って単一行のソリューションがあることを望んでいましたがtypeid、どちらもここでは役に立ちません。

私の具体的な問題は次のとおりです。基本クラスのインスタンスへのポインターを引数として受け取る関数があります。この関数は、派生型をパラメーターとして受け取るテンプレート関数を呼び出します。例えば

void myFunc( Base *base )
{
    myTemplateFunc<Derived>();
}

ステートメントの長いリストを使用せずに、コードをシンプルに保ちたいのifですが、どうすればよいかわかりません。Baseオブジェクト自体はテンプレート関数に渡されず、型のみが渡されることに注意してください。

参考までに、次のようなものを探しています

void myFunc( Base *base )
{
    myTemplateFunc<decltype(base)>();
}

しかし、これはタイプのみを返すためBase、ここでは役に立ちません。

4

2 に答える 2

7

もう1つの方法は、複数のディスパッチです

class Base
{
   virtual void dispatch () = 0;
};

template <class T>
class BaseTpl : public Base
{
public:
  void dispatch () {myTemplateFunc<T> ();}
};

その後

class DerviedType1 : public BaseTpl <DerviedType1>
{
};

と実際の使い方

void myFunc( Base *base )
{
    base->dispatch ();
}
于 2012-10-31T13:47:16.633 に答える
5

どうですか

struct Base
{
   virtual void execute() = 0;
}

struct Derived : Base
{
   virtual void execute()
   {
      myTemplateFunc<Derived>();
   }
}

と呼ぶだけです

void myFunc( Base *base )
{
    base->execute();
}

正しいメソッドにディスパッチします。

于 2012-10-31T13:45:38.093 に答える