首页 / C++ / C++11之lambda回调设置与应用
C++11之lambda回调设置与应用
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C++11之lambda回调设置与应用,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2269字,纯文字阅读大概需要4分钟。
内容图文
![C++11之lambda回调设置与应用](/upload/InfoBanner/zyjiaocheng/598/7bfdbf24f7394b88b2735485c3242bff.jpg)
在程序中有时候我们需要实现回调效果,比如先设置监听,然后在后面具体执行完某个操作后再将该操作的结果通知给前面监听中。这种机制实际很常用,比如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表达式也相对来说较为简单,只有传入的参数,没有捕获参数。在回调的时候可以保证该回调函数所在的对象未被销毁。而在异步线程中有可能导致在回到的时候回调函数已被销毁,可能导致回调失败。
内容总结
以上是互联网集市为您收集整理的C++11之lambda回调设置与应用全部内容,希望文章能够帮你解决C++11之lambda回调设置与应用所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。