我有一个功能需要能够适用于不同的容器类型,例如
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。
答案 0 :(得分:4)
您应该将T
声明为template template parameter,以表明它是模板名称(并且需要实例化参数),例如
template<template <typename...> class T>
void foo(const T<bar>&, const T<double>&);
答案 1 :(得分:4)
基本上有三种解决方案:
使用迭代器(这是标准库本身使用的)
为不同的参数使用不同的模板,让编译器推导出实际的类型。使用您的功能,它将类似于
template<typename T, typename U> void foo(const T&, const U&);
如果您只需要迭代容器的内容,建议使用解决方案2。如果您需要访问容器本身,建议使用解决方案3。
答案 2 :(得分:0)
所谓的模板模板参数将允许您编写所需的代码(也在其他答案中显示或在CppReference上)。
或者,您也可以编写接受iterators的通用函数。这正是<algorithm>
中的函数实现的方式。我倾向于认为接受迭代器的函数实际上更灵活,因为调用者可以决定函数需要处理的范围。