在C ++中如何使用模板函数作为std :: for_each中的第3个参数?

时间:2009-04-22 09:05:21

标签: c++ templates stl foreach

我正在尝试使用std :: for_each来输出向量的内容,这些向量可能包含不同的类型。所以我写了一个通用的输出函数:

template<typename T> void output(const T& val)
{
    cout << val << endl;
}

我想用它:

std::for_each(vec_out.begin(), vec_out.end(), output);

但是编译器在for_each语句中抱怨“无法推断出模板参数”。还抱怨“函数模板不能成为另一个函数模板的参数”。

这不可能吗?我原以为编译器会知道vec_o​​ut的类型(它的向量),所以应该实例化函数“output(const double&amp; val)”?

如果这不起作用,如何在不编写手动循环的情况下获得类似的STL功能?

我对C ++很陌生并且还在学习绳索: - )

3 个答案:

答案 0 :(得分:9)

尝试:

std::for_each(vec_out.begin(), vec_out.end(), output<T>);

其中vec_out是T类型的容器(vector)。

注意:for_each算法需要一个一元仿函数用于其最后一个参数。请参阅链接以获取使用仿函数的示例。

答案 1 :(得分:7)

您必须传递模板的实例化。如果你的向量是整数向量,那就像output<int>

例如:

template<typename T> void output(const T& val)
{
    cout << val << endl;
}



void main(int argc,char *argv[])
{
    std::vector<int> vec_out;
    std::for_each(vec_out.begin(), vec_out.end(), output<int>);
}   

答案 2 :(得分:7)

我只想添加正确答案:如果您将模板函数包装在函数对象(aka functor)中,编译器可以推断出类型:

struct OutputFunctor
{
  template <typename T>
  void operator()(const T& val) const { output(val); }
};

void test()
{
  std::vector<int> ints;
  std::vector<float> floats;

  std::for_each(ints.begin(), ints.end(), OutputFunctor());
  std::for_each(floats.begin(), floats.end(), OutputFunctor());
}