2009-08-03 102 views
8

最近,我對VC2010中對lambda的支持感到非常興奮。我正在慢慢掌握這個功能將C++轉化爲更好的東西的全部潛力。C++ 0x的圖書館計劃?

但是後來我意識到這種潛力很大程度上取決於像boost和QT這樣的日常庫中主流支持lambda。
有誰知道是否有計劃將這些庫擴展爲C++ 0x的新特性?

lambda實際上取代了對boost :: lambda的需求,以及與boost交互的所有內容。 QT可以在其所有容器中添加對lambda的支持,甚至可以作爲定義的替代方法SLOT s

+1

'的boost ::另一件事不被替換lambda表達式目標bind`。 `std :: bind`將完成綁定函數的工作。相反,lambdas將部分替換`boost :: lambda`(及其後繼者,boost :: phoenix,afaik)中的功能。 lambda目前不能做的是`boost :: lambda`的多態性。創建可用於任何參數類型的函數的能力:`_1 ++`遞增任何參數類型,而`[](int&a){a ++; }`只能增加int。我現在聽說概念不在C++中,多態lambda表達式又是一個選項。 – 2009-08-03 16:40:29

+1

@litb - 這很有趣,你有沒有鏈接到材料解釋爲什麼概念是類型參數lambdas的障礙? – 2009-08-03 17:24:48

+0

我不知道有詳細討論它的論文,但是我在usenet上讀到這個論文。我想,應該有一種方法來說'需要Blah [](T t){...}`或類似的東西來使lambda的`operator()`模板受到約束。另一個問題可能是,在受限模板中,只能調用其他受約束的模板以允許對模板定義進行類型檢查。因此,對於帶有簡單未受保護模板的`operator()`的lambda,不能在如下所示的約束模板中使用它:`template void f(T t){([](u){...}) (T); }`。 – 2009-08-03 18:50:24

回答

6

Lambdas已經非常適合現有的庫 - 函數接受由模板參數給出的類型的函數對象的任何地方。

這是關於它們的偉大之處之一 - 它們是語言特徵的一個典型例子,它以一種漂亮的語法編纂了現有的練習。

很明顯,boost lambda庫變得多餘,但這意味着它不需要添加任何新功能。

3

機會是這樣的庫將等待,直到有相應的C++ 0x功能的編譯器支持,並且在主流編譯器確實支持它之前,不會有太多的麻煩。別屏住呼吸。

4

我不明白lambda的用法如何取決於庫的支持。 Lambdas不需要創建許多類來包裝不同的小算法,並且與其他語言/庫特徵整齊地結合在一起(想起std::function)。無論你傳遞函數對象還是函數指針,都可以使用lambdas。

所以他們主要增加另一種替代方案來利用現有的代碼和庫。我可以看到庫更好地支持lambda的唯一方法是使用更多的功能風格的方法。

0

大多數庫都使用標準函數指針進行回調。 C++ 0x lambdas可以用作函數指針,所以大多數庫不需要修改。其他庫使用模板,以便它們可以接受任何可調用的對象(例如,std::foreach不需要修改)。

我能想到的那個庫的唯一其他C++ 0x功能可能會更改爲使用強類型enums。此外,庫可能會開始使用extern模板來減少編譯時間。

1

這不是真的,你不能用C++ 0x lambda替換boost :: lambda。見here由於某些原因(關於增強綁定,但我認爲大部分轉移)

此外,@丹尼爾this可能會幫助您開始使用lambda函數/增強綁定插槽。這讓我的生活變得非常簡單。

另外,從我的消息來源@litb,lambda表達式都不會被改變(哎呀)