我正在尝试使用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_out的类型(它的向量),所以应该实例化函数“output(const double&amp; val)”?
如果这不起作用,如何在不编写手动循环的情况下获得类似的STL功能?
我对C ++很陌生并且还在学习绳索: - )
答案 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());
}