我有一个类Foo
,它使用 CRTP 从父类继承模板方法,避免必须提供几十个单独的成员方法。像这样的东西:
class Foo : public SomeBarClass<Foo>
{
//..
//from SomeBarClass
public:
template <class T> void onMsg(T* msg);
private:
IFoxMod* foxMod_;
};
现在,在实现中onMsg
,我想要这样的东西:
template <class T>
void Foo::onMsg(T* msg)
{
if (foxMod_->shouldDoStuff(msg))
{
//do stuff
}
}
并且可以有多种foxMod_
类型(其中一种在Foo
构造函数中通过配置文件中给出的名称进行实例化),只要它们遵守提供bool shouldDoStuff
方法的公共接口即可。问题在于,这导致我定义以下内容:
struct IFoxMod
{
virtual ~IFoxMod() {}
template <class T> shouldDoStuff(T* msg) = 0;
};
对于所有FoxMods
要实现的东西(比如,class redMountainLogic : public IFoxMod
可能有它自己的辨别方式,当它适合做事情时)。
这是非法的,因为一个人不能有虚拟模板,我正试图找到一种解决方法。基本上,我需要动态调度,但我传递的参数是一个模板。我想不出解决方法。