如何用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,这个网站说:
这个函数和相关的类型在c++ 11中已被弃用,取而代之的是更通用的std::function和std::ref,它们都是从普通函数创建可调用的适配器兼容的函数对象。
谢谢
最常用的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
只是一个多余的中间人。
相关文章:
- 使用std::multimap迭代器创建std::list
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如何导出包含具有"std::unique_ptr"值的"std::map"属性的
- 从持续时间构造std::chrono::system_clock::time_point
- std::具有相同基类的类的变体
- 引用 std::shared:ptr 以避免引用计数
- C++14 unique_ptr并使用已删除的函数'std::unique-ptr' unique_ptr错误
- 使用std :: String ptr的错误打印std :: String
- C++中的大小释放:全局运算符delete的正确行为是什么(void*ptr,std::size_t size)
- std::哈希表示无序映射中的唯一 PTR
- boost::shared_ptr和std::shared-ptr的同居
- 我可以用std::shared_ptr而不是boost::shared-ptr构建boost库吗
- 正确使用std智能指针以确保ptr安全
- 如何创建 std::string 包装器,它将 ptr 保留为 std::string 和 ptr 到创建该包装器实例的
- 为什么 std::string{ "const char ptr" } 有效?
- 为什么 gcc 4.9.0 中没有定义"void operator delete(void* ptr, std::size_t size) noexcept;"?
- 在 std::map 的值中使用非 ptr 是一种很好的做法吗
- 共享 PTR - C++:std::shared_ptr<T> 和 std::shared_ptr<T const> 有什么区别?