網(wǎng)站首頁 編程語言 正文
lambda表達式格式
lambda表達式的格式
[捕捉列表](參數(shù)列表)mutable->返回值類型{ 語句部分 };
其中參數(shù)列表、返回值類型是可選的,捕捉列表、函數(shù)體可以為空。
先來看一個較為簡單的lamda表達式
int main(void) { auto add = [](int a, int b)->int {return a + b; }; cout << add(1, 2) << endl; return 0; }
mutable可以省略,暫時不考慮。
- 捕捉列表,捕捉列表的
[]
是千萬不能省略的,編譯器會根據(jù)[]
判斷該表達式是否為lambda表達式,捕捉列表能夠捕捉上下文的變量提供給lambda表達式使用。 - 參數(shù)列表,就和普通的函數(shù)傳參是一樣的,如果不需要參數(shù),那么可以連同
()
一起省略 - mutable:默認(rèn)情況下,lambda表達式參數(shù)列表和捕捉列表被修飾成const屬性,而mutable的作用就是取消它的const屬性。如果使用了mutable參數(shù)一定不能省略,如果參數(shù)為空,那么需要保留
()
。 - ->返回值類型。返回值類型明確或沒有返回值的情況下,該部分可省略,編譯器會對返回值類型進行推導(dǎo)。
- 語句部分。和不同函數(shù)的函數(shù)體內(nèi)語句部分是一樣的含義,函數(shù)體內(nèi)不僅可以使用它的參數(shù),還可以使用所有捕獲到的變量。
所以最簡單的lambda表達式應(yīng)該是[]{}
lambda表達式又被稱為匿名函數(shù),無法被直接調(diào)用,它的底層其實也是仿函數(shù)類。需要借助auto將表達式賦值給一個變量。
說明Boost.Lambda
在 C++11 之前,您需要使用像 Boost.Lambda 這樣的庫來利用 lambda 函數(shù)。從 C++11 開始,這個庫可以被視為已棄用,因為 lambda 函數(shù)現(xiàn)在是編程語言的一部分。如果您在不支持 C++11 的開發(fā)環(huán)境中工作,您應(yīng)該在轉(zhuǎn)向 Boost.Lambda 之前考慮 Boost.Phoenix。 Boost.Phoenix 是一個較新的庫,如果您需要在沒有 C++11 的情況下使用 lambda 函數(shù),它可能是更好的選擇。
lambda 函數(shù)的目的是使代碼更緊湊且更易于理解(請參見示例 43.1)。
示例 43.1。帶有 lambda 函數(shù)的 std::for_each()的
#include <boost/lambda/lambda.hpp> #include <boost/lambda/if.hpp> #include <vector> #include <algorithm> #include <iostream> int main() { std::vector<int> v{1, 3, 2}; std::for_each(v.begin(), v.end(), boost::lambda::if_then(boost::lambda::_1 > 1, std::cout << boost::lambda::_1 << "\n")); }
Boost.Lambda 提供了幾個助手來創(chuàng)建無名函數(shù)。代碼寫在應(yīng)該執(zhí)行的地方,不需要包裝在函數(shù)中,也不必顯式調(diào)用函數(shù)。在示例 43.1 中,std::cout << boost::lambda::_1 << "\n" 是一個 lambda 函數(shù),它需要一個參數(shù),它在寫入標(biāo)準(zhǔn)輸出后跟一個新行。
boost::lambda::_1 是一個占位符,它創(chuàng)建一個需要一個參數(shù)的 lambda 函數(shù)。占位符中的數(shù)字決定了預(yù)期參數(shù)的數(shù)量,因此 boost::lambda::_2 預(yù)期兩個參數(shù),而 boost::lambda::_3 預(yù)期三個參數(shù)。 Boost.Lambda 只提供了這三個占位符。示例 43.1 中的 lambda 函數(shù)使用 boost::lambda::_1,因為 std::for_each() 需要一個一元函數(shù)。
包括 boost/lambda/lambda.hpp 以使用占位符。
請注意,\n 而不是 std::endl,在示例 43.1 中用于輸出新行。如果您使用 std::endl,該示例將無法編譯,因為 lambda 函數(shù) std::cout << boost::lambda::_1 的類型與一元函數(shù)模板 std::endl() 預(yù)期的類型不同。因此,您不能使用 std::endl。
示例 43.2。帶有 boost::lambda::if_then() 的 lambda 函數(shù)
#include <boost/lambda/lambda.hpp> #include <boost/lambda/if.hpp> #include <vector> #include <algorithm> #include <iostream> int main() { std::vector<int> v{1, 3, 2}; std::for_each(v.begin(), v.end(), boost::lambda::if_then(boost::lambda::_1 > 1, std::cout << boost::lambda::_1 << "\n")); }
頭文件 boost/lambda/if.hpp 定義了可用于在 lambda 函數(shù)中創(chuàng)建 if 控制結(jié)構(gòu)的結(jié)構(gòu)。最簡單的構(gòu)造是函數(shù)模板 boost::lambda::if_then(),它需要兩個參數(shù):第一個參數(shù)是一個條件。如果條件為真,則執(zhí)行第二個參數(shù)。兩個參數(shù)都可以是 lambda 函數(shù),如示例 43.2 所示。
除了 boost::lambda::if_then() 之外,Boost.Lambda 還提供函數(shù)模板 boost::lambda::if_then_else() 和 boost::lambda::if_then_else_return(),它們都需要三個參數(shù)。還為循環(huán)和轉(zhuǎn)換運算符提供函數(shù)模板,并在 lambda 函數(shù)中拋出異常。 Boost.Lambda 定義的許多函數(shù)模板使得定義 lambda 函數(shù)成為可能,這些函數(shù)絲毫不遜色于普通的 C++ 函數(shù)。
原文鏈接:https://yamagota.blog.csdn.net/article/details/127832708
相關(guān)推薦
- 2022-06-23 Android通過SeekBar調(diào)節(jié)布局背景顏色_Android
- 2022-12-04 關(guān)于SQL查詢語句關(guān)鍵字方法_MsSql
- 2022-12-22 Python?Flask框架實現(xiàn)Proteus仿真Arduino與網(wǎng)頁數(shù)據(jù)交互_python
- 2022-06-11 利用Nginx實現(xiàn)URL重定向的簡單方法_nginx
- 2022-07-30 Linux下查看文件和文件夾大小
- 2022-06-27 python中的標(biāo)準(zhǔn)庫html_python
- 2022-03-23 C語言利用system調(diào)用系統(tǒng)命令行詳情_C 語言
- 2022-03-22 C++賦值運算符_C 語言
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支