C++ C++;使用模板类指针作为模板参数而不提供参数

C++ C++;使用模板类指针作为模板参数而不提供参数,c++,templates,C++,Templates,标题有点混乱,希望我能澄清 我有一个使用模板的简单类: template <class T> class Value { }; 模板 阶级价值 { }; 和另一个扩展无序_集的类: template<class T> class Collection : public std::unordered_set<T> { }; 模板 类集合:公共标准::无序集合 { }; 这两个类都有一些其他的代码,但我认为它们与我的问题无关 在Collection类的特定

标题有点混乱,希望我能澄清

我有一个使用模板的简单类:

template <class T>
class Value
{
};
模板
阶级价值
{
};
和另一个扩展无序_集的类:

template<class T>
class Collection : public std::unordered_set<T>
{
};
模板
类集合:公共标准::无序集合
{
};
这两个类都有一些其他的代码,但我认为它们与我的问题无关

在Collection类的特定实现中,我希望它能够获取指向任何值的指针,而不管创建它时使用的模板参数是什么。换句话说,我希望在语义上能有类似的东西:

class ValueCollection : public Collection<Value*>
{
};

ValueCollection *vc = new ValueCollection();
vc.insert(new Value<std::string>("hello"));
vc.insert(new Value<int>(5));
类值集合:公共集合
{
};
ValueCollection*vc=新的ValueCollection();
vc.插入(新值(“hello”);
vc.插入(新值(5));

当然,这是行不通的。如何获得类似的功能?

只需为
Value
类模板提供一个公共基类,确保它有一个
virtual
析构函数,并使用它添加实例化的值:

struct ValueBase {
    virtual ~ValueBase() {}
};
template <typename T>
struct Value
    : ValueBase {
};
struct ValueBase{
虚拟~ValueBase(){}
};
模板
结构值
:ValueBase{
};

顺便说一句,您通常最好不要继承STL容器:它们不是为继承而设计的。您最有可能造成微妙的问题,而不是从节省下来的少量工作中获益。

您不能从STL容器派生。@ipc:unordered\u集不是STL的一部分,但是它是C++11标准库的一部分。@BatchyX:它是C++11的STL的一部分。这一点仍然非常有效-这是坏的。我的坏。我的Java背景胜过了我。谢谢你指出这一点。我想知道为什么我没有想到这一点。感谢您提供的关于坏扩展的提示(这也适用于所有提到它的人)。我将重构我的代码,让集合包装它。