你有两个选择。为了示例,请考虑您的Foo
模板结构和此声明:
Foo<double> v;
你的第一选择是
template <typename T>
void DoSomething1(T& x) { /* ... */ }
// ...
DoSomething1(v);
我坚信这是您所需要的。
但是,情况可能并非如此。T<U>
也许,您确实需要在T
模板类和类型的表单类型上调用该函数U
。例如,您可能希望在函数体内T
使用int
(即 create )进行实例化。T<int> y;
那么,你的第二个选择是
template <template <typename> class T, typename U>
void DoSomething2(T<U>& x) { T<int> y; /* ... */ }
// ...
DoSomething2(v);
不幸的是,这可能还不够!如果你试试,
std::vector<double> w;
// ...
DoSomething2(w);
最后一行无法编译。原因是std::vector
模板类接受两个类型参数,并且DoSomething2
期望模板类只接受一个。(当然可以std::vector
只用一个参数进行实例化,因为第二个参数有默认值。)解决方案是使用 C++11 可变参数模板模板参数:
template <template <typename, typename...> class T, typename U>
void DoSomething3(T<U>&) { T<int> y; /* ... */ }
// ...
DoSomething3(v);
DoSomething3(w);