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