首页 > 解决方案 > 是否可以将成员函数指针从 std::bind 更改为 lambda?

问题描述

std::function我用, 编写了回调方法 std::bind

std::functionA 类中的对象 func1指向 bFoo(int, int)B 类成员的函数。

我的程序中的回调代码:

// Class A - A.h
class A
{
  public:
    template<class T>
    void setCallback(T *pClass, void(T::*pFunc)(int, int));

  private:
    std::function<void(int, int)> func1;
}

template<class T>
inline void A::setCallback(T *pClass, void(T::*pFunc)(int, int))
{
  func1 = std::bind(pFunc, pClass, std::placeholders::_1, std::placeholders::_2); 
}

// Class A - A.cpp
...
func1(x,y);
...

// Class B - B.h
class B
{
  public:
    void bFoo(int x, int y);

  private:
    A a; // instance of class A
}

// Class B - B.cpp
B::B()
{
  a.setCallback(this, &B::bFoo);
}

它工作正常。

但是,听说在 C++ 14 及更高版本中,std::bind完全可以用 lambda 代替,而且 lambda 比std::bind.

所以我尝试将绑定更改为 lambda 并查找了许多示例,但就我而言,我还没有找到如何将绑定替换为 lambda。

我想将另一个类的成员函数分配给std::function使用 lambda,而不是std::bind.

这可能吗?

标签: c++lambdac++14std-functionstdbind

解决方案


可以通过使用您当前的代码来做到这一点

func1 = [=](int x, int y){ (pClass->*pFunc)(x,y); };

在我看来,最好在调用站点上写出 lambda。为此,您需要修改setCallback.

class A
{
  public:
    template<class T>
    void setCallback(T callback);

  private:
    std::function<void(int, int)> func1;
}

template<class T>
inline void A::setCallback(T callback)
{
  func1 = callback; 
}

然后我们可以B使用 lambda 调用 from 构造函数。

class B
{
  public:
    void bFoo(int x, int y);

  private:
    A a; // instance of class A
}

// Class B - B.cpp
B::B()
{
  a.setCallback([&](int x, int y){ bFoo(x, y); }); // & will capture this
}

推荐阅读