模板化类型的shared_ptr多态性

时间:2015-09-28 03:27:37

标签: templates c++11 polymorphism shared-ptr

std::shared_ptr允许存储类型的多态性,例如:

class A {};
class B: public A {};

我可以拥有std::vector<std::shared_ptr<A>>B个对象。

但是,如果我想更进一步,使A成为模板并存储std::shared_ptr的{​​{1}}不同专精,我该怎么办?例如:

A

是否有可能同时存储template<typename T> class A {}; class Strategy {}; class StrategyOne : public Strategy {}; class StrategyTwo : public Strategy {}; std::vector<std::shared_ptr<A<Strategy>>>类型对象的StrategyOne

1 个答案:

答案 0 :(得分:0)

Igor Tandetnik完全正确,A<Strategy>A<StrategyOne>没有任何共同之处。

那就是说,在我的情况下,我意识到A是一个琐碎的类,在我的例子中是factory。这意味着我可以简单地让Strategy继承并专门化A来解决我的问题。简化它就像这样:

template<typename T> class A {
public:
    virtual T* get() = 0;
};

class Strategy : public A<Strategy> {
public:
    virtual Strategy* get() { return new Strategy; }
};

class StrategyOne : public Strategy {
public:
    virtual StrategyOne* get() { return new StrategyOne; }
};

现在StrategyStrategyOne都是A<Strategy>类型,因此我可以将它们存储在shared_ptr<A<Strategy>中。由于多态返回类型,StrategyOne的{​​{1}}方法可以从get()调用,对我来说很有用,我仍然可以使用A<Strategy>来直接获取StrategyOne }。