如何用std::function和std::ref替换std::ptr_fun

How to replace std::ptr_fun with std::function and std::ref

本文关键字:std ptr fun 替换 何用 function ref      更新时间:2023-10-16

我想学习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,这个网站说:

这个函数和相关的类型在c++ 11中已被弃用,取而代之的是更通用的std::functionstd::ref,它们都是从普通函数创建可调用的适配器兼容的函数对象。

有人可以重写上面的例子没有ptr_fun和函数推荐c++ 11?

谢谢

最常用的c++ 11方法可能是使用lambda(或range for)

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

演示

范围:

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

演示

你可以用std::bind:

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

演示

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

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

演示

如果你绝对想使用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)));

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

你做使用std::function在这里。这没有意义。

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

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