gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:33:06 29 4
gpt4 key购买 nike

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

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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com