-2

对于以下模板类

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

我希望能够拥有一个基类指针向量,我知道我需要使用一个接口类,但我无法让它工作,任何建议将不胜感激。

4

1 回答 1

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。所以最好使用那些经过良好测试的实现。

于 2017-04-29T14:22:59.653 回答