为什么要弃用bind()?

Mar*_*n G 4 c++ lambda stdbind std-function

读取用于C++ 17的建议有关删除标准的一些过时,旧的和未使用的部分(http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4190.htm)我找到D.9部分有点奇怪:

D.9"粘合剂"[depr.lib.binders]

这定义了bind1st()/ bind2nd(),它们被bind()严格取代.(在将来,我会认为,bind()的本身已被lambda表达式,尤其是通用的Lambda表达式取代,所以绑定()应该被废弃,但不是此提案的一部分.)

我没有得到的是关于bind()自己被lambdas取代的评论.

如果我有课:

class A
{
  public:
    void f(int a){}
    void f(int a, int b){}
}
Run Code Online (Sandbox Code Playgroud)

而且我想将一个函数指针传递A::f给某个函数,someFunction以便这个函数可以在实例化的对象上调用它A,我声明someFunction:

void someFunction(const std::function<void(int, int)>&);
Run Code Online (Sandbox Code Playgroud)

并称之为:

A a;
someFunction(std::bind(static_cast<void (A::*)(int, int)> (&A::f),
                       std::ref(a), 
                       std::placeholders::_1,
                       std::placeholders::_2));
Run Code Online (Sandbox Code Playgroud)

如何使用lambda实现相同的功能?真的没有什么bind()可以做的,用lambda无法做到吗?

Cha*_*had 7

你怎么做呢?非常直接且不太深奥(我的观点)比使用std::ref和的绑定示例placeholders_.

#include <iostream>
#include <functional>

class A
{
public:
   void f(int a) {}
   void f(int a, int b) { std::cout << a + b << '\n';}
};

void someFunction(const std::function<void(int, int)>& f)
{
   f(1, 2);
}

int main()
{
   A a;
   someFunction([&] (int x, int y) { a.f(x, y); });
   return 0;
}
Run Code Online (Sandbox Code Playgroud)