在成员数据中使用模板参数的模板类的基类指针

时间:2017-04-29 10:44:02

标签: c++ template-classes

对于以下模板类

template <class T> class Arbitrary {
protected:
    vector<T> ObjectArray;
public:
    Arbitrary(){}   
};

我希望能够有一个基类指针的向量,我知道我需要使用一个接口类,但我不能让它工作,任何建议都会非常感激。

1 个答案:

答案 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。因此,最好使用那些经过良好测试的实现。