boost學習之Boost.Lambda

GeekAdo發表於2015-01-09

匿名函式 又稱為lambda函式 - 已經在多種程式語言中存在,在Boost.Lambda庫的幫助下,在 C++ 應用中也可以使用它們了。lambda 函式的目標是令原始碼更為緊湊,從而也更容易理解

 Boost.Lambda 提供了幾個結構來定義匿名函式。程式碼就被置於執行的地方,從而省去將它包裝為一個函式再進行相應的函式呼叫的這些開銷。

    與 Boost.Bind 相類似,Boost.Lambda 也定義了三個佔位符,名為 _1, _2 和 _3。但與 Boost.Bind 不同的是,這些佔位符是定義在單獨的名字空間的。因此,該例中的第一個佔位符是通過 boost::lambda::_1 來引用的。 為了滿足編譯器的要求,必須包含相應的標頭檔案 boost/lambda/lambda.hpp。

    雖然程式碼的位置位於 std::for_each() 的第三個引數處,看起來很怪異,但 Boost.Lambda 可以寫出正常的 C++ 程式碼。 通過使用佔位符,容器 v 的元素可以通過 << 傳給 std::cout 以將它們寫出到標準輸出流。

    雖然 Boost.Lambda 非常強大,但也有一些缺點。 要在以上例子中插入換行的話,必須用 "\n" 來替代 std::endl 才能成功編譯。 因為一元 std::endl 模板函式所要求的型別不同於 lambda 函式 std::cout << boost::lambda::_1 的函式,所以在此不能使用它。

// boostConsole.cpp : 定義控制檯應用程式的入口點。

#include "stdafx.h"
#include <iostream> 
#include <vector>    
#include <algorithm>   
#include <boost/lambda/lambda.hpp>    
#include <boost/lambda/if.hpp>    
using namespace std;
using namespace boost;
 
void print(int i)   
{   
	cout << i << std::endl;   
}   

int _tmain(int argc, _TCHAR* argv[])
{
	vector<int> v;   
	v.push_back(1);   
	v.push_back(3);   
	v.push_back(2);   
	//輸出到標準輸出流
	for_each(v.begin(), v.end(), print);  

	//將元素輸出到標準輸出流
	for_each(v.begin(), v.end(), cout << lambda::_1 << "\n");  
    
	//將大於1的元素輸出到標準輸出流
    for_each(v.begin(), v.end(), lambda::if_then(lambda::_1 > 1, cout << lambda::_1 << "\n"));   
	getchar();
	return 0;
}


相關文章