c++ 11 lambda使用std::function作为委托

c++ 11 lambda usage as delegate with std::function

本文关键字:function c++ lambda 使用 std      更新时间:2023-10-16

我有一个Button类,它有一个onClick std::function类型的字段和"setClickListener"方法设置任何lambda函数到这个std::function字段,如下所示:

#include <functional>
class Button {
public:
void doSomething() {
   if(onClick) {
      onClick();
   }
}
typedef std::function<void()> OnClickListener;
OnClickListener onClick;
void setClickListener(OnClickListener onClickCallBack) {
   onClick = onClickCallBack;
}
};

在我的应用程序代码中,我正在创建一个lambda函数并设置为按钮的onClick函数,如下所示:

#include "Button.h"
void onAnEventOccured() {
   button->setClickListener([this]()->void {
      // Do something
      memberFunction();
      anotherMemberFunction();
      // etc...
   });
}
void memberFunction() {
   // Do some work...
}
void anotherMemberFunction() {
   // Do some work...
}

现在,关键部分是在应用程序的生命周期中多次调用onaneventocected方法,并且一次又一次地设置lambda函数。我在Visual Studio 2015上运行,并将调试跟踪点放在std::函数类的解构器上,可以看到它在设置setClickListener时击中跟踪点。我猜这是lambda函数的解构器,它已被销毁,同时离开onaneventoccure函数的范围,并按预期复制该lambda存储在Button实例中。

我说的对吗?这个体系结构是否存在内存泄漏?

你不能打电话吗?

   button->setClickListener([this]()->void {
      // Do something
      memberFunction();
      anotherMemberFunction();
      // etc...
   });

在构造函数中或在应用程序代码中的任何其他初始化方法中?

同样,你的代码可以得到一个右值引用。

void setClickListener(OnClickListener&& callback);