【问题标题】:How to specialize template template parameter for std::vector in C++如何在 C++ 中专门化 std::vector 的模板模板参数
【发布时间】:2016-03-15 14:39:03
【问题描述】:

我需要专门化这段代码:

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

对于模板 std::vector。目前,它适用于任何 2 参数模板(“类 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 &lt;class T, class Alloc&gt; void function (const std::vector&lt;T, Alloc&gt;&amp; argument); 和调用有什么问题(function(arg))?

标签: c++ templates vector


【解决方案1】:

不要专门化,超载:

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

这将是您传递 std::vector 的首选,而不是任何其他 2-type 类模板(例如 std::list)。并且它将以一致、易于推理的方式受到青睐。此外,无论如何您都不能部分专门化函数模板。

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


请注意,此语法不正确:

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

明确指定的模板参数从左到右。因此,在这里您将 T 指定为 Some2ArgsTemplate &lt;A, B&gt;... 这可能会阻止扣除成功。您不需要明确指定任何内容:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多