C++11之lambda回调设置与应用
作者:互联网
在程序中有时候我们需要实现回调效果,比如先设置监听,然后在后面具体执行完某个操作后再将该操作的结果通知给前面监听中。这种机制实际很常用,比如window底下的消息机制,Qt中的信号槽的机制都有类似的效果。但是在C++中并没有类似机制,那么我们应如何实现呢?
实际上在C++中我们可以使用模板、函数指针、抽象类、和lambda就可实现回调的效果,本文重点讲解如何使用lambda和function在同步线程中实现回调的效果。关于lambda介绍可参我前面的博客:https://blog.csdn.net/King_weng/article/details/100612476
一、同步回调
1、LambdaClass.h
#include <functional>
#include <iostream>
using namespace std;
class LambdaClass
{
public:
LambdaClass() {}
~LambdaClass() {}
void start(string str);
void doSomething(string str);
void setResult(const function<void(const bool &)> &cb);
void onResult(const bool &isOK);
private:
function<void(const bool &isOK)> _cbResult;
};
2、LambdaClass.cpp
#include "LambdaClass.h"
void LambdaClass::start(string str)
{
setResult([](const bool &isOK) {
// 第一次并不会进入到此lambda的函数体中,只有当回调的时候才进来
if (isOK) {
cout << "do somethign OK!!!" << endl << endl;
}
else {
cout << "do somethign ERROR!!!" << endl << endl;
}
});
doSomething(str);
}
void LambdaClass::doSomething(string str)
{
// 执行完某个操作后再回调
cout << "start dosomething..." << endl;
bool isTrue = false;
if (str == "true") {
isTrue = true;
}
onResult(isTrue);
}
void LambdaClass::setResult(const function<void(const bool &)> &cb)
{
_cbResult = cb; // 将lambda表达式保存起来以便回调
}
void LambdaClass::onResult(const bool &isOK)
{
if (_cbResult) {
_cbResult(isOK); // 在此处回调
_cbResult = nullptr;
}
}
3、main.cpp
#include <iostream>
#include "LambdaClass.h"
using namespace std;
int main()
{
LambdaClass set;
string str = "true";
set.start(str);
string str2 = "false";
set.start(str2);
system("pause");
return 0;
}
输出:
从结果可以看出,在main函数中刚开始调用start时其中名为setResult的lambda表达式的函数体并未执行,而是在做了某个操作后(doSomething()函数),在onResult()函数中做了回调后才执行到setResult的lambda表达式的函数体中,即实现了回调的效果。
另:异步回调
在上面的例子中是在同一个类中实现的回调效果,其lambda表达式也相对来说较为简单,只有传入的参数,没有捕获参数。在回调的时候可以保证该回调函数所在的对象未被销毁。而在异步线程中有可能导致在回到的时候回调函数已被销毁,可能导致回调失败。
标签:11,include,void,C++,LambdaClass,回调,isOK,lambda 来源: https://blog.csdn.net/King_weng/article/details/115079012