如何用 std::function 和 std::ref 替换 std::ptr_fun
How to replace std::ptr_fun with std::function and std::ref
我正在尝试学习 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 推荐的函数重写上面的示例吗?
谢谢
最 C++11 的方式可能是使用 lambda(或范围 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
只不过是一个多余的中间人。
我正在尝试学习 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 推荐的函数重写上面的示例吗?
谢谢
最 C++11 的方式可能是使用 lambda(或范围 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
只不过是一个多余的中间人。