如何用std :: function和std :: ref

时间:2016-11-13 16:11:51

标签: c++ c++11 std-function

我试图学习C ++ 11的新功能,我有这个代码:

void print(int t, string separator)
{
    cout << t << separator;
}


int elements[] = { 10, 20, 30, 40, 50, 60, 40 };
string delim = " - ";

for_each(elements, elements + 7, bind2nd(ptr_fun(print), delim));

输出:

10 - 20 - 30 - 40 - 50 - 60 - 40 -

关于ptr_fun, this 网站说:

从C ++ 11开始,不推荐使用此函数和相关类型,而采用更通用的 std :: function std :: ref ,两者都从普通函数创建可调用的适配器兼容函数对象。

有人可以在没有ptr_fun的情况下重写上面的例子,并且推荐使用C ++ 11的函数吗?

谢谢

2 个答案:

答案 0 :(得分:7)

大多数C ++ 11方式可能是使用lambda(或ranged for)

for_each(elements, elements + 7, [&delim](int val){ print(val, delim); });

demo

范围为:

for(int x : elements)
    print(x, delim);

demo

您可以使用std::bind

for_each(elements, elements + 7, bind(print, placeholders::_1, delim));

demo

但在这种情况下,你可以将整个事情重写为

copy(elements, elements + 7, ostream_iterator<int>(cout, delim.c_str()));

demo

如果您绝对想要使用std::function,可以修改以上示例:

for_each(elements, elements + 7, function<void(int)>([&delim](int val){ print(val, delim); }));

for_each(elements, elements + 7, function<void(int)>(bind(print, placeholders::_1, delim)));

除非你需要类型擦除,否则这是毫无意义的。

答案 1 :(得分:3)

你在这里使用std::function。这毫无意义。

std::function<...>是一种可以将许多可调用对象转换为的类型。将此类型用于应接受可调用对象的变量或函数参数是有意义的,尤其是在需要类型擦除时(例如,当您的函数不能作为模板时)。

创建std::function临时值并立即将其传递给标准算法std::for_each。标准算法通常接受所有类型的可调用对象,包括您可以从创建std::function 的任何对象。所以std::function只不过是一个多余的中间人。