这取决于您将其传递给什么,如果您尝试实例化的模板将接受 2 个(或在 c++11 中为可变数量的)类的类模板作为参数,那么您可以将 std::vector 传递给那。然而,在大多数情况下,模板需要类作为参数,并且您不能传递类模板 std::vector。
template <class T>
struct gimme_a_type{};
template <template <class,class> class T>
struct gimme_a_template{};
gimme_a_type<std::vector> //<-- does not compile, expected a type, got a template
gimme_a_type<std::vector<int> > //<-- compiles, expected a type, got a type
gimme_a_template<std::vector> //<-- compiles, expected a template, got a template that has the correct signature
gimme_a_template<std::vector<int> > //<-- does not compile, expected a template, got a type
根据您的编辑,使用类模板作为模板参数存在困难。当您尝试传递的类模板中有默认参数(std::vector
在我们的例子中)时,实际上很难精确匹配参数的数量。请注意,上面的示例需要一个包含 2 个类的类模板,而不仅仅是一个。这是因为std::vector
有两个参数,第二个是std::allocator<T>
我们默认的。
以下示例演示了该问题:
template <template <class, class> class Tem>
struct A
{
Tem<int> v; //<-- fails to compile on gcc, Tem takes two parameters
Tem<int, std::allocator<int> >; //<-- compiles, but requires a priori knowledge of Tem
};
template <template <class...> class Tem>
struct A2
{
Tem<int> v; //<-- This C++11 example will work, but still isn't perfect.
};
C++11 的例子更好,但是如果有人传递了一个具有作为签名的类,template <class, bool = false> class A3
它会再次失败,因为A2
需要一个可变数量的类,而不是一个可变数量的任何东西。因此,即使A3<int>
可能是有效的实例化,您也无法将该类传递给A2
.
解决方案是始终在模板参数列表中使用类型,并使用std::integral_constant
包装模板来传递整数常量。