这可能是一个微不足道的问题,但却让我发疯。
我想定义一个可以使用不同容器的单个函数foo()
,如:
vector<int>
,vector<double>
,set<int>
和set<double>
。
我试图像这样定义foo:
template<typename CONT, typename T>
int foo(CONT<T>){
//evaluate x
return (int) x ;
}
这种定义不起作用,但我不明白为什么。
我如何实现类似的目标?
答案 0 :(得分:6)
指定容器类模板及其实例化的方法是使用模板模板参数:
template <template <typename...> class Cont, typename T>
int foo(Cont<T>) {
...
}
请注意Cont
使用的是可变数量的参数,否则它将不会涵盖标准容器所具有的未知数量的默认模板参数。
答案 1 :(得分:5)
考虑一下:
template< class ContainerT >
int foo( ContainerT const& c ) {
}
然后ContainerT
可以是任何内容,包括std::vector<int>
,std::vector<std::string>
甚至std::map<std::string, int>
。因此,您无需添加新模板参数,如果您需要知道类型,只需使用容器的value_type
:
typedef typename ContainerT::value_type container_type; // Or T in your foo