如何在 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 <class T, class Alloc> void function (const std::vector<T, Alloc>& 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 <A, B>
... 这可能会阻止扣除成功。您不需要明确指定任何内容:
Some2ArgTemplate<A, B> arg = ...;
function(arg); // deduce T=A, Alloc=B, VECTOR=Some2ArgTemplate
【讨论】:
以上是关于如何在 C++ 中专门化 std::vector 的模板模板参数的主要内容,如果未能解决你的问题,请参考以下文章
在 OpenCV 中 std::vector 而不是 cv::Mat 的 `type` 的解释是啥,我该如何更改它? (C++)
如何创建 C++ 用户定义的类,以便该类的 std::vector 不包含该类的某些成员