您应该使用模板模板参数:
template<typename T, template <typename, typename> class Container>
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
class MyMultibyteString
{
Container<T, std::allocator<T>> buffer;
// ...
};
这将允许您编写:
MyMultibyteString<int, std::vector> mbs;
这是一个编译的实时示例。编写上述内容的另一种方法可能是:
template<typename T,
template <typename, typename = std::allocator<T>> class Container>
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
class MyMultibyteString
{
Container<T> buffer; // <== No more need to specify the second argument here
// ...
};
这是相应的现场示例。
您唯一需要注意的是模板模板参数声明中的参数数量和类型必须与您要作为模板参数传递的相应类模板的定义中的参数数量和类型完全匹配,无论事实上,其中一些参数可能具有默认值。
例如,类模板std::vector
接受两个模板参数(元素类型和分配器类型),尽管第二个具有默认值std::allocator<T>
。正因为如此,你不能写:
template<typename T, template <typename> class Container>
// ^^^^^^^^
// Notice: just one template parameter declared!
class MyMultibyteString
{
Container<T> buffer;
// ...
};
// ...
MyMultibyteString<int, std::vector> mbs; // ERROR!
// ^^^^^^^^^^^
// The std::vector class template accepts *two*
// template parameters (even though the second
// one has a default argument)
这意味着您将无法编写一个可以同时接受std::set
和std::vector
作为模板模板参数的类模板,因为与 不同的是std::vector
,类模板接受三个模板参数。std::set