3

我正在尝试使用 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& val)”?

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

我对 C++ 很陌生,但仍在学习中 :-)

4

3 回答 3

9

尝试:

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

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

注意:该for_each算法的最后一个参数需要一个一元函子。有关使用函子的示例,请参阅链接。

于 2009-04-22T09:11:54.447 回答
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>);
}   
于 2009-04-22T09:10:44.713 回答
7

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

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());
}
于 2009-04-22T10:30:07.767 回答