網站首頁 編程語言 正文
一 函數語法
我們平時調用函數的時候,都是需要被調用函數的函數名,但是匿名函數就不需要函數名,而且直接寫在需要調用的地方,對于以前沒用過的小伙伴來說,第一眼看見了這語法可能很迷惑。
C++11的基本語法格式為:
[capture](parameters) -> return_type { /* ... */ }
(1) [capture] :[]內為外部變量的傳遞方式,值、引用等,如下
[] //表示的是在lambda定義之前的域,對外部參數的調用; [=] //表示外部參數直接傳值 [&] //表示外部參數傳引用,可修改值。當默認捕獲符是 & 時,后繼的簡單捕獲符必須不以 & 開始。而當默認捕獲符是 = 時,后繼的簡單捕獲符必須以 & 開始。 [x, &y] //x is captured by value, y is captured by reference [&, x] //x is explicitly captured by value. Other variables will be captured by reference [=, &z] //z is explicitly captured by reference. Other variables will be captured by value
(2)(parameters) :()內為形參,和普通函數的形參一樣。
(3)-> return_type:->后面為lambda函數的返回類型,如 -> int
、-> string
等。一般情況下,編譯器推出lambda函數的返回值,所以這部分可以省略不寫。
(4){ /* … */ }:{}內為函數主體,和普通函數一樣。
二 函數應用
1、在普通函數中使用
首先是定義,執行下面這句,不會運行函數 ?。?!
std::function<int(int,int)> add = [](int a,int b) ->int { return a + b; };
上面代碼,你知道lambda函數返回類型為int類型,但是函數左邊不能直接賦值給int變量(編譯器會報錯),因為此處為lambda函數的定義,所以左邊為函數指針類型變量,一般懶得寫函數指針類型,就直接賦值給auto類型變量,如下。
auto add = [](int a,int b) ->int { return a + b; };
下面才是函數的使用、運行?。?!
如何運行lambda函數并獲取函數返回值?執行函數需要看下面代碼:
auto add = [](int a,int b) ->int { return a + b; }; int result = add(1,2);
又或者如下:
auto add = [](int a,int b) ->int { return a + b; }; int(*func_ptr)(int,int) = add ; int result = func_ptr(1,2);
2、在qt信號槽中使用
我覺得labmda函數非常適合在信號槽中使用。
(1)返回的函數指針可以直接用在connect函數中,剛好契合。
(2)該槽函數可能比較簡單,只有這個地方使用,可以省去槽函數聲明,使代碼看上去更加簡便,且業務代碼更加集中。
基本使用
connect(sys, &SYSClass::sig_1, this, [=](int index) { ...... });
綁定信號槽的時候定義lambda函數,當收到信號的時候才執行槽函數,即lambda函數。
使用示范
在mTime時間后執行動畫,動畫執行后delete對象,非常適合彈窗關閉時,窗口關閉的動畫操作。(widgetPtr
為彈窗的指針)
QTimer::singleShot(mTime,widgetPtr,[=]() { QPropertyAnimation *pAnimation = new QPropertyAnimation(widgetPtr,"windowOpacity",widgetPtr); pAnimation->setDuration(1000); pAnimation->setEasingCurve(QEasingCurve::InCirc); pAnimation->setStartValue(1.0); pAnimation->setEndValue(0.0); pAnimation->start(); connect(pAnimation,&QPropertyAnimation::finished,[=]{ delete widgetPtr; }); });
3、在std::sort排序函數中的使用
在標準庫的排序函數使用中,可以使用函數回調的方式自定義排序的比較規則。
(1)sort函數提供排序算法;
(2)floatList為容器變量,提供數據結構和數據;
(3)他們兩個之間使用迭代器連接。
理解如下圖:
而我們sort函數可以使用第三個參數(函數回調方式)作為比較依據進行排序,該參數就可以寫成lambda函數,這樣比較方法寫在排序函數這里,可以使得代碼更加直白、簡便、集中。參考代碼如下:
std::sort( floatList, floatList + N, [](float a, float b) { return a < b; });
上面lambda函數,是sort函數中的迭代器每次運行做排序比較的時候就調用。
注意:
(1)lambda函數參數為( float , float ),類型必須與容器的元素類型一致。
(2)運行時,迭代器自動幫你把參數傳入回調函數。
(3)回調函數返回值固定為bool,這里可以不寫,由編譯器自動確定。
三 總結
lambda函數定義后返回的是函數指針類型,即如:std::function<int(int,int)>
,所以一般很少使用,我們在很多代碼中也很少看到。
正常情況下,lambda函數相對普通函數的定義和使用其實沒什么優勢。但是某些使用到函數指針的場合下,我們就可以酌情考慮使用,特別是函數指針作為函數參數的時候,比如qt的信號槽、回調函數等,使用起來即方便,又顯得代碼高大上,簡直就完美O(∩_∩)O。
原文鏈接:https://blog.csdn.net/weixin_42887343/article/details/122099296
相關推薦
- 2022-09-07 Golang必知必會之Go?Mod命令詳解_Golang
- 2022-03-27 C語言中const,指針和引用的關系_C 語言
- 2023-07-04 Linux直接創建SSH無密碼連接
- 2022-07-10 TypeError: Cannot read property ‘forceUpdate‘ of u
- 2022-08-17 python+pytest接口自動化之session會話保持的實現_python
- 2022-12-12 使用PlatformView將?Android?控件view制作成Flutter插件_Android
- 2022-09-05 Redis 數據刪除策略
- 2022-04-29 Sql?Server之數據類型詳解_MsSql
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支