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

Posted

技术标签:

【中文标题】如何在 C++ 中专门化 std::vector 的模板模板参数【英文标题】:How to specialize template template parameter for std::vector in C++ 【发布时间】: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))? 【参考方案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

【讨论】:

以上是关于如何在 C++ 中专门化 std::vector 的模板模板参数的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中合法地声明向量变量?

在 OpenCV 中 std::vector 而不是 cv::Mat 的 `type` 的解释是啥,我该如何更改它? (C++)

std::vector 插入是如何实现的? C++

如何创建 C++ 用户定义的类,以便该类的 std::vector 不包含该类的某些成员

C++ STL应用与实现2: 如何使用std::vector

C++ STL应用与实现2: 如何使用std::vector