繁体   English   中英

如何编写一个采用通用C ++标准库容器的模板函数

[英]How can I write a template function that takes a generic C++ standard library container

例如,我有一个功能需要能够适用于不同的容器类型

void foo(const std::vector<bar>& param1, const std::vector<double>& params2)

void foo(const std::list<bar>& param1, const std::list<double>& params2)

bar是我写的一个class 函数体本身使用通用的C ++标准库函数。

有没有办法可以扼杀这个? 我努力了

template<typename T> void foo(const T<bar>&, const T<double>&)

但这会给编译器带来错误

错误C2988:无法识别的模板声明/定义

我正在使用MSVC2015。

您应该将T声明为模板模板参数,以指示它是模板名称(并且需要实例化参数),例如

template<template <typename...> class T> 
void foo(const T<bar>&, const T<double>&);

生活

基本上有三种解决方案:

  1. 使用模板模板参数

  2. 使用迭代器(这是标准库本身使用的)

  3. 对不同的参数使用不同的模板,让编译器推导出实际的类型。 有了你的功能,它就像是

     template<typename T, typename U> void foo(const T&, const U&); 

如果您只需要迭代容器的内容,建议使用解决方案2。 如果您需要访问容器本身,建议使用解决方案3。

所谓的模板模板参数将允许您编写所需的代码(如其他答案或CppReference中所示 )。

或者,您也可以编写接受迭代器的泛型函数。 这正是<algorithm>中的函数的实现方式。 我倾向于认为接受迭代器的函数实际上更灵活,因为调用者可以决定函数需要处理的范围。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM