gpt4 book ai didi

C++ template covariance polymorphism 收藏

转载 作者:行者123 更新时间:2023-11-28 05:54:17 24 4
gpt4 key购买 nike

我正在编写一个名为 Factory 的通用工厂类

//abstract factory
template <class C>
class Factory{
public:
virtual C* create()=0;
}
//concrete factory
template <class C>
class NormalFactory:public Factory<C>{
public:

C* create(){return new C;}
}

我想做以下事情:

typedef Factory<Enemy> EnemyFactory;
EnemyFactory* e = new NormalFactory<Troll>; //Troll inherits Enemy
//client code
Enemy* enemy = e->create();

但不幸的是我不能这样做,因为 NormalFactory 不继承 Factory。有没有办法解决这个问题来完成我想要的?

(在不知道 Enemy 的实际类型的情况下实现抽象的 EnemyFactory create())

最佳答案

一个简单的技术解决方案是使用所需的基础参数化混凝土工厂,如下所示:

template <class C, class C_base = C>
class NormalFactory:public Factory<C_base>{
public:

C* create(){return new C;}
};

Example at Coliru .

但是,不知何故设计感觉不对。我建议考虑工厂的目的是什么,以及在 C++ 中是否有任何其他更自然的方式来完成它。即,我认为这是一个 XY-question .

关于C++ template covariance polymorphism 收藏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34561730/

24 4 0