对于以下模板类
template <class T> class Arbitrary {
protected:
vector<T> ObjectArray;
public:
Arbitrary(){}
};
我希望能够有一个基类指针的向量,我知道我需要使用一个接口类,但我不能让它工作,任何建议都会非常感激。
答案 0 :(得分:0)
[..]我想最终写
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
。因此,最好使用那些经过良好测试的实现。