對我來說,第一次使用boost.lambda的時候感覺是非常震撼的。它減少了**的編寫量,增強了資訊的區域性性,讓**更加緊湊簡潔。但是lambda的原理卻讓人非常的迷惑,考慮下面的一行**,這行**列印乙個容器內的所有元素的值:
std::for_each(str_con.begin(), str_con.end(), std::cout << _1);
這裡的_1到底是什麼東西呢?
我按照語法規則來邏輯地分析一下以上這行**。
首先,std::cout << _1表示式的求值結果必須是乙個仿函式或者是乙個函式指標,這是std::for_each所要求的。但是從std::cout << _1上來看,這應該是乙個過載operator《符號的函式呼叫。這個函式的引數形式可能是下面這種形式的:
operator<<(std::ostream& stream,some_wierd_type ignore);
從可能性上來看,這個表示式返回乙個仿函式,這個仿函式進行"std::cout << 容器元素值的操作",我把這個仿函式的大致輪廓描繪一下:
template
struct someop
};因此按照我們的分析,std:cout << _1是乙個operator《過載函式的呼叫,並且返回乙個someop的仿函式。
把這些組織一下,在ddj的一篇文章裡(http://www.ddj.com/cpp/184401733?pgno=7),>的作者bjorn karlsson展示了乙個****** lambda device, example codes as follows:
namespace sample ;
placeholder_1 _1;
template struct ******_binder_lshift
template t& operator()(u u) };}
template sample::******_binder_lshift
operator<<(t& t,sample::placeholder_1 ignore)
int main()
我的總結:
lambda表示式就是一小段執行**,有些時候可能只是一行執行**的語句,如果想讓這行執行**的語句能出現在stl的演算法中使用,比如上面的std::cout << _1或者 _1 + 3形式的執行**,則必須的,這幾行或一行簡易**的求值結果是乙個仿函式,因此這一行**則必須是乙個操作符的過載函式,如果是操作符的過載函式,則必須都要求至少有乙個運算元,因此必須需要乙個佔位符,按照lambda的**邏輯,某個操作符的過載函式必須返回乙個執行該操作的仿函式,我的意思是說:
對於std::cout << _1, 它的operator<<(std::ofstream& stream, placeholder_1 igonore)過載函式返回了乙個仿函式比如叫做******op,而******op的operator()內的**
應該是執行stream << elem;邏輯的,如果是執行elem + 3這樣的邏輯,顯然違反了std::cout << _1的lambda表示式的本意。
ajax原理的簡單實現
ajax的主要作用就是不重新整理頁面更新頁面的內容,也就是非同步傳輸。用來顯示ajax響應的div。下面就是一段使用ajax的簡單示例。function ajaxrequest else if window.activexobject if req return false req.onreadys...
dbUtils簡單實現原理
在資料庫初級階段,通過連線池連線資料庫,然後在將查詢的結果轉換為物件,過程太過複雜,以下便是實現對此類過程的簡單封裝,另外可以根據此類的封裝,簡單的理解一下spring 中jdbctemplate的query 和update 方法。public class dbutils public dbutil...
簡單promise實現原理
promise可以有三種狀態,分別是pedding fulfilled rejected pending promise物件例項建立時候的初始狀態 fulfilled 可以理解為成功的狀態 rejected可以理解為失敗的狀態 構造乙個promise例項需要給promise建構函式傳入乙個函式。傳入...