当许多派生类型可能时,从基类型的实例中获取派生类型

1 c++ templates types

我已经看到了这个问题的解决方案,建议使用

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
Run Code Online (Sandbox Code Playgroud)

虽然功能齐全,但这个解决方案远非优雅,我希望有一个单行解决方案,decltype或者这些typeid都没有帮助我.

我的具体问题如下.我有一个函数,它将指向基类实例的指针作为参数.然后,此函数将调用模板函数,该函数将派生类型作为其参数.例如

void myFunc( Base *base )
{
    myTemplateFunc<Derived>();
}
Run Code Online (Sandbox Code Playgroud)

我想保持我的代码简单,没有清单的if陈述,但我不知道如何去做.应该注意的是,Base对象本身不会传递给模板函数,只有它的类型.

作为参考,我正在寻找类似的东西

void myFunc( Base *base )
{
    myTemplateFunc<decltype(base)>();
}
Run Code Online (Sandbox Code Playgroud)

但这只会返回Base类型,这对我没有帮助.

小智 7

另一种方式是多次调度

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

template <class T>
class BaseTpl : public Base
{
public:
  void dispatch () {myTemplateFunc<T> ();}
};
Run Code Online (Sandbox Code Playgroud)

然后

class DerviedType1 : public BaseTpl <DerviedType1>
{
};
Run Code Online (Sandbox Code Playgroud)

和实际的消息

void myFunc( Base *base )
{
    base->dispatch ();
}
Run Code Online (Sandbox Code Playgroud)


Luc*_*ore 5

怎么样

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

struct Derived : Base
{
   virtual void execute()
   {
      myTemplateFunc<Derived>();
   }
}
Run Code Online (Sandbox Code Playgroud)

并把它称为

void myFunc( Base *base )
{
    base->execute();
}
Run Code Online (Sandbox Code Playgroud)

将派遣到正确的方法.