我已经看到了这个问题的解决方案,建议使用
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)
怎么样
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)
将派遣到正确的方法.
| 归档时间: |
|
| 查看次数: |
454 次 |
| 最近记录: |