我已经看到了这个问题的解决方案,建议使用
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
,这两点都没有帮助我。< / p>
我的具体问题如下。我有一个函数,它将指向基类实例的指针作为参数。然后,此函数将调用模板函数,该函数将派生类型作为其参数。 E.g。
void myFunc( Base *base )
{
myTemplateFunc<Derived>();
}
我想保持我的代码简单,没有if
语句的清单,但我不确定如何去做。应该注意的是,Base
对象本身不会传递给模板函数,只会传递给它。
作为参考,我正在寻找符合
的内容void myFunc( Base *base )
{
myTemplateFunc<decltype(base)>();
}
但这只会返回Base
类型,这对我没有帮助。
答案 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();
}
将调度到正确的方法。