对于以下模板类
template <class T> class Arbitrary {
protected:
vector<T> ObjectArray;
public:
Arbitrary(){}
};
我希望能够拥有一个基类指针向量,我知道我需要使用一个接口类,但我无法让它工作,任何建议将不胜感激。
对于以下模板类
template <class T> class Arbitrary {
protected:
vector<T> ObjectArray;
public:
Arbitrary(){}
};
我希望能够拥有一个基类指针向量,我知道我需要使用一个接口类,但我无法让它工作,任何建议将不胜感激。
[..] 我想最终写
vector<Arbitrary*> name;
Arbitrary
是模板,而不是类型。要从中“获取”一种类型,您需要将其“应用”到另一种类型(如int
)。这为您Arbitrary<int>
提供了“结果”类型。这个过程称为模板实例化。
如果您想要一个向量,其中包含可能已从模板实例化的任何可能类型的对象Arbitrary
,那么您需要给它们一个通用类型(这样每个对象“都是”该通用类型的对象)。这是因为std::vector
只存储单一类型的对象。
要让对象“表现”(在某种意义上)不同,即使它们“拥有”一个通用类型,您需要使它们(或者更确切地说是它们的通用类型)多态。这是通过赋予通用类型一些virtual
功能来完成的。(并且由于您想通过公共类型公开的“接口”删除/破坏对象,因此您需要使析构函数为虚拟!)
struct ArbitraryBase {
// Add "common interface" functions here, as virtual
virtual ~ArbitraryBase() = 0; // pure virtual to avoid creating objects
};
inline ArbitraryBase::~ArbitraryBase() {}
template<typename T>
struct Arbitrary : ArbitraryBase {
// whatever
};
现在,要真正能够使用该多态属性并且不成为对象切片的受害者,您需要使用引用或指针语义:
std::vector<ArbitraryBase *> objects;
您应该考虑智能指针而不是原始指针,例如向量std::unique_ptr<ArbitraryBase>
是否objects
应该拥有对象的所有权,或者在对象std::reference_wrapper<ArbitraryBase>
的生命周期由其他东西可靠处理的情况下使用。
但是,如果您不添加任何通用接口(更多虚拟成员函数),ArbitraryBase
那么您基本上是在重新发明std::any
/ boost::any
。所以最好使用那些经过良好测试的实现。