如何在C ++中专门化std :: vector的模板模板参数

时间:2016-03-15 14:39:04

标签: c++ templates vector

我需要对此代码进行专门化:

template < class T, class Alloc, template <class, class> class VECTOR >
void function(const VECTOR<T, Alloc> &argument);

用于模板std :: vector。目前,它适用于任何双参数模板(&#34;类VECTOR&#34;)参数。

换句话说:

// 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的想法都可以。

1 个答案:

答案 0 :(得分:4)

不要专注,超载:

template < class T, class Alloc>
void function(const std::vector<T, Alloc> &argument);

在您传递std::vector而不是任何其他2种类型模板(例如std::list)时,这是首选。并且它将以一致,易于推理的方式优先考虑。此外,无论如何,您无法部分专门化功能模板。

显式函数模板特化是...... problematic。您编写专业的顺序可能非常重要!

请注意,此语法不正确:

function< Some2ArgsTemplate <A, B> > (arg);

明确指定的模板参数从左到右。因此,您在此处指定TSome2ArgsTemplate <A, B> ...这可能会阻止扣除成功。您不应该明确指定任何内容:

Some2ArgTemplate<A, B> arg = ...;
function(arg); // deduce T=A, Alloc=B, VECTOR=Some2ArgTemplate