什么是Lamda表达式
Lamda表达式是一个函数,其通用写法为: [capture](parameters) mutable ->return-type{statement}
其中:
capture:捕捉列表------可以在表达式中使用代码前后的变量
parameters:给这个lamda表达式传递的参数列表,如果不需要传参的话,parameters可以连同()一起省略。
mutable:mutable修饰符。默认情况下,Lambda函数总是一个const函数,mutable可以取消其常量性。在使用该修饰符时,参数列表不可省略(即使参数为空);
->return-type:返回类型。用追踪返回类型形式声明函数的返回类型。我们可以在不需要返回值的时候也可以连同符号”->”一起省略。此外,在返回类型明确的情况下,也可以省略该部分,让编译器对返回类型进行推导;
{statement}:函数体。内容与普通函数一样,不过除了可以使用参数之外,还可以使用所有捕获的变量。
如下图所示:
[]里面的是代码前后的变量,常用的3个如下所示:
捕获方式 含义 能否修改外部变量 生命周期风险 [&]以引用方式捕获所有自动变量(包括 this指针)✅ 能 ⚠️高(引用悬空,比如捕获临时变量指针,可以改为[ptr]) [=]以值(拷贝)方式捕获所有自动变量(包括 this指针的值)❌ 不能直接修改(除非 mutable)✅低(独立副本) [this]仅捕获当前对象的 this指针(按值,即指针的拷贝)✅ 能修改对象成员 ⚠️中(对象被销毁后 this悬空)
()里面的是信号函数传来的参数
如果需要设置代码前后变量,则需要这样加引用:
如果需要访问成员函数或者变量,则这样写:
假如信号参数没有名字,比如:
void error(QNetworkReply::NetworkError);
可以这样实现:
connect(reply, static_cast<void (QNetworkReply::*)(QNetworkReply::NetworkError err)>(&QNetworkReply::error), this, [i](QNetworkReply::NetworkError err){ });其它知识
可以使用std::function,自己实现一个Lamda表达式的回调函数
头文件:
#include <functional> #include <iostream> class LoginWindow : public QWidget { // ... enum LoginResultType{ LoginResult_Wait =0, // 等待 DrawType_UserPwdErrored, // 用户密码错误 DrawType_IpErrored , // IP错误 LoginResult_LoginSucceed // 登录成功 }; using QueryLoginCallback = std::function<LoginResultType(QString user, QString pwd)>; explicit LoginWindow(QWidget *parent, bool *loginIsOk, UserManageInfo *userInfo, const QueryLoginCallback &queryLogin) { // ... 省略 _queryLogin = queryLogin; } // 点击登录按钮 void onLoginButtonClicked() { LoginResultType type = _queryLogin(ui->user->currentText(), ui->pwd->text()); // 调用回调函数 // 处理type } QueryLoginCallback _queryLogin; }当调用登录界面的时候就这样写:
UserManageInfo userLoginInfo; LoginWindow w(NULL, &loginIsOk, &userLoginInfo, [=](QString user, QString pwd){ qDebug() << "this is from callback f"<<user<< pwd << ip << loginCancel; if(pwd == "123") return LoginWindow::LoginResult_LoginSucceed; // 登录成功 else return LoginWindow::DrawType_UserPwdErrored; // 登录失败 }); w.show(); QApplication::instance()->exec();