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

时间:2017-07-10 09:27:39

标签: c++ c++11 templates

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

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。

3 个答案:

答案 0 :(得分:4)

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

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

LIVE

答案 1 :(得分:4)

基本上有三种解决方案:

  1. 使用template template arguments

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

  3. 为不同的参数使用不同的模板,让编译器推导出实际的类型。使用您的功能,它将类似于

    template<typename T, typename U> void foo(const T&, const U&);
    
  4. 如果您只需要迭代容器的内容,建议使用解决方案2。如果您需要访问容器本身,建议使用解决方案3。

答案 2 :(得分:0)

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

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