c++ - 从不同类型的模板类创建对象

标签 c++ templates inheritance

我不太确定如何表述我的问题,但这是我试图解决的难题:

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/

相关文章:

c++ - 运算符重载 "new"C++

c++ - 使用 C++ 模板时出现错误 C2955 和错误 C2244

c++ - C++模板短路逻辑AND(&&)

c++ - glm中有计算这个单位 vector 的函数吗?

c++ - 如何 "concatenate"boost::mpl::vectors

c++ - 获取 C++ 模板参数包的总大小(以字节为单位)

c++ - 接口(interface)继承

java - 无需子类继承减少代码重复

c++ - OpenCV:如何从以太网摄像头捕获帧

c++ - 使用 D3DPT_LINELIST 渲染 3D 线条