标题有点令人困惑,所以我希望能清除它。
我有一个使用模板的简单类:
template <class T>
class Value
{
};
另一个扩展unordered_set的类:
template<class T>
class Collection : public std::unordered_set<T>
{
};
这些类都有其他一些代码,但我认为它与我的问题无关。
在Collection类的特定实现中,我希望它能够获取指向任何Value的指针,而不管创建它时使用的模板参数。换句话说,我希望能够在语义上类似这样的东西:
class ValueCollection : public Collection<Value*>
{
};
ValueCollection *vc = new ValueCollection();
vc.insert(new Value<std::string>("hello"));
vc.insert(new Value<int>(5));
当然,这不起作用。我将如何获得类似的功能?
答案 0 :(得分:2)
只需给你Value
类模板一个公共基类,确保它有一个virtual
析构函数并使用它来添加实例化的值:
struct ValueBase {
virtual ~ValueBase() {}
};
template <typename T>
struct Value
: ValueBase {
};
顺便说一下,你通常最好不要不继承STL容器:它们不是为继承而设计的,你最有可能造成微妙的问题,而不是从少量保存的工作中获益。