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

时间:2012-10-31 13:41:41

标签: 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

虽然功能齐全,但这个解决方案远非优雅,我希望有一个单线解决方案,沿着decltypetypeid,这两点都没有帮助我。< / p>

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

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

我想保持我的代码简单,没有if语句的清单,但我不确定如何去做。应该注意的是,Base对象本身不会传递给模板函数,只会传递给它。

作为参考,我正在寻找符合

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

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

2 个答案:

答案 0 :(得分:7)

另一种方式是多次调度

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 ();
}

答案 1 :(得分:5)

怎么样

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

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

并将其称为

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

将调度到正确的方法。