我需要这段代码的特化:
template < class T, class Alloc, template <class, class> class VECTOR >
void function(const VECTOR<T, Alloc> &argument);
用于模板 std::vector。目前,它适用于任何 2 参数模板(“class VECTOR”)参数。
换句话说:
// A, B -- any unpredictable types
function< std::vector <A, B> > (arg); // specialization
function< Some2ArgsTemplate <A, B> > (arg); // general
function< SomeOther2ArgsTemplate <A, B> > (arg); // general
是否可以在不知道 A 和 B 的情况下实现它?任何 C++11/C++14 想法都可以。
最佳答案
不要专门化,重载:
template < class T, class Alloc>
void function(const std::vector<T, Alloc> &argument);
如果您传入 std::vector
,这将是首选与任何其他 2 类型类模板(例如 std::list
)相反。它将以一致的、易于推理的方式成为首选。此外,您无论如何都不能部分特化函数模板。
显式函数模板特化是... problematic .您编写特化的顺序可能很重要!
请注意,此语法不正确:
function< Some2ArgsTemplate <A, B> > (arg);
明确指定的模板参数从左到右。所以在这里你指定 T
成为Some2ArgsTemplate <A, B>
...这可能会阻止演绎成功。您不需要明确指定任何内容:
Some2ArgTemplate<A, B> arg = ...;
function(arg); // deduce T=A, Alloc=B, VECTOR=Some2ArgTemplate
关于c++ - 如何在 C++ 中专门化 std::vector 的模板模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36014359/