我不太确定如何表述我的问题,但这是我试图解决的难题:
if (config.a)
myObject = new Object<DummyInterface>();
else
myObject = new Object<RealInterface>();
所以任务是创建一个对象,如果在配置中指定了虚拟接口(interface),否则使用真正的接口(interface)类。 那我该如何声明 myObject 呢? 有几个选项,我可以让 Object 类从没有模板的抽象类派生:即:
class Base
{
...
}
template <class T>
class Object : public Base
{
...
}
然后我可以将 myObject 声明为:
Base* myObject;
但是问题来了:如果我的 Object 类声明了一个非虚方法怎么办:
template <class T>
class Object : public Base
{
public:
T getInterface() { return myInterface;}
private:
T myInterface;
}
我不能这样调用它:
myObject->getInterface()
而且我不能进行动态转换,因为直到运行时我才知道类型...
有什么解决办法的建议吗?也许还有其他解决方案?
最佳答案
一种解决方法是使用访问者模式。这样,您的基类可以实现 visit()
方法,并且您的派生实例可以覆盖...
例如..
SomeComponent
{
template <typename T> // I'm being lazy here, but you should handle specific types
void handle(T& cInst)
{
// do something
}
};
class Base
{
public:
virtual void visit(SomeComponent& cComp) = 0;
};
template <class T>
class Object : public Base
{
public:
virtual void visit(SomeComponent& cComp)
{
cComp.handle(*this);
}
};
现在你可以做到这一点
SomeComponent c;
Base* obj = new Object<int>;
obj->visit(c);
c
将获得正确的类型。
关于c++ - 从不同类型的模板类创建对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7121452/