如何创建模板函数,其中容器和类型都是参数?

时间:2012-10-18 23:06:48

标签: c++ templates

这可能是一个微不足道的问题,但却让我发疯。 我想定义一个可以使用不同容器的单个函数foo(),如: vector<int>vector<double>set<int>set<double>

我试图像这样定义foo:

template<typename CONT, typename T>
   int foo(CONT<T>){
      //evaluate x
      return (int) x ;
   }

这种定义不起作用,但我不明白为什么。

我如何实现类似的目标?

2 个答案:

答案 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