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

C++ Using a template class pointer as a template parameter without giving it a parameter

本文关键字:参数 指针 C++      更新时间:2023-10-16

标题有点混乱,所以希望我能澄清一下。

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

template <class T>
class Value
{
};

另一个扩展unordered_set类:

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));

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

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

struct ValueBase {
    virtual ~ValueBase() {}
};
template <typename T>
struct Value
    : ValueBase {
};

顺便说一句,您通常最好不要继承 STL 容器:它们不是为继承而设计的,您最有可能引起微妙的问题,而不是从少量保存的工作中受益。