最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++?Boost?Lambda表達式詳解

 更新時間:2022年11月18日 10:26:30   作者:無水先生  
Lambda?表達式(lambda?expression)是一個匿名函數,Lambda表達式基于數學中的λ演算得名。本文就來為大家詳細講講C++中Lambda表達式的使用,需要的可以參考一下

lambda表達式格式

lambda表達式的格式

[捕捉列表](參數列表)mutable->返回值類型{ 語句部分 };

其中參數列表、返回值類型是可選的,捕捉列表、函數體可以為空。

先來看一個較為簡單的lamda表達式

int main(void)
{
	auto add = [](int a, int b)->int {return a + b; };
	cout << add(1, 2) << endl;
	return 0;
}

mutable可以省略,暫時不考慮。

  • 捕捉列表,捕捉列表的[]是千萬不能省略的,編譯器會根據[]判斷該表達式是否為lambda表達式,捕捉列表能夠捕捉上下文的變量提供給lambda表達式使用。
  • 參數列表,就和普通的函數傳參是一樣的,如果不需要參數,那么可以連同()一起省略
  • mutable:默認情況下,lambda表達式參數列表和捕捉列表被修飾成const屬性,而mutable的作用就是取消它的const屬性。如果使用了mutable參數一定不能省略,如果參數為空,那么需要保留()。
  • ->返回值類型。返回值類型明確或沒有返回值的情況下,該部分可省略,編譯器會對返回值類型進行推導。
  • 語句部分。和不同函數的函數體內語句部分是一樣的含義,函數體內不僅可以使用它的參數,還可以使用所有捕獲到的變量。

所以最簡單的lambda表達式應該是[]{}

lambda表達式又被稱為匿名函數,無法被直接調用,它的底層其實也是仿函數類。需要借助auto將表達式賦值給一個變量。

說明Boost.Lambda

在 C++11 之前,您需要使用像 Boost.Lambda 這樣的庫來利用 lambda 函數。從 C++11 開始,這個庫可以被視為已棄用,因為 lambda 函數現(xiàn)在是編程語言的一部分。如果您在不支持 C++11 的開發(fā)環(huán)境中工作,您應該在轉向 Boost.Lambda 之前考慮 Boost.Phoenix。 Boost.Phoenix 是一個較新的庫,如果您需要在沒有 C++11 的情況下使用 lambda 函數,它可能是更好的選擇。

lambda 函數的目的是使代碼更緊湊且更易于理解(請參見示例 43.1)。

示例 43.1。帶有 lambda 函數的 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)建無名函數。代碼寫在應該執(zhí)行的地方,不需要包裝在函數中,也不必顯式調用函數。在示例 43.1 中,std::cout << boost::lambda::_1 << "\n" 是一個 lambda 函數,它需要一個參數,它在寫入標準輸出后跟一個新行。

boost::lambda::_1 是一個占位符,它創(chuàng)建一個需要一個參數的 lambda 函數。占位符中的數字決定了預期參數的數量,因此 boost::lambda::_2 預期兩個參數,而 boost::lambda::_3 預期三個參數。 Boost.Lambda 只提供了這三個占位符。示例 43.1 中的 lambda 函數使用 boost::lambda::_1,因為 std::for_each() 需要一個一元函數。

包括 boost/lambda/lambda.hpp 以使用占位符。

請注意,\n 而不是 std::endl,在示例 43.1 中用于輸出新行。如果您使用 std::endl,該示例將無法編譯,因為 lambda 函數 std::cout << boost::lambda::_1 的類型與一元函數模板 std::endl() 預期的類型不同。因此,您不能使用 std::endl。

示例 43.2。帶有 boost::lambda::if_then() 的 lambda 函數

#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 函數中創(chuàng)建 if 控制結構的結構。最簡單的構造是函數模板 boost::lambda::if_then(),它需要兩個參數:第一個參數是一個條件。如果條件為真,則執(zhí)行第二個參數。兩個參數都可以是 lambda 函數,如示例 43.2 所示。

除了 boost::lambda::if_then() 之外,Boost.Lambda 還提供函數模板 boost::lambda::if_then_else() 和 boost::lambda::if_then_else_return(),它們都需要三個參數。還為循環(huán)和轉換運算符提供函數模板,并在 lambda 函數中拋出異常。 Boost.Lambda 定義的許多函數模板使得定義 lambda 函數成為可能,這些函數絲毫不遜色于普通的 C++ 函數。

到此這篇關于C++ Boost Lambda表達式詳解的文章就介紹到這了,更多相關C++ Boost Lambda內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論

芦溪县| 民乐县| 阳谷县| 甘谷县| 武汉市| 达日县| 南京市| 建昌县| 曲周县| 邻水| 吉木萨尔县| 石楼县| 获嘉县| 湾仔区| 齐齐哈尔市| 开阳县| 武夷山市| 兴隆县| 普格县| 安国市| 天台县| 叙永县| 新安县| 上犹县| 泰兴市| 翼城县| 巴里| 丹巴县| 阳山县| 平潭县| 巴彦淖尔市| 临漳县| 咸宁市| 五河县| 舞钢市| 潮安县| 华亭县| 黑山县| 高台县| 衡水市| 榆林市|