函數對象和高階編程(Function Objects and Higher-Order Programming)Boost.Bind
Bind是標準庫綁定器(bind1st和bind2nd)的一個泛化。這個庫支援使用統一的文法對任何行為類似於函數、函數指標、函數對象或者成員函數指標的東西進行綁定。它也支援通過使用嵌套綁定器的方式完成函數式組合(functional composition)。這個庫並不需要標準庫綁定器所要求的那些先決條件,最明顯的地方就是大多數時候並不需要為你的類提供關於result_type、first_argument_type、以及second_argument_type的類型定義(typedefs)。有了這個庫,就沒必要再使用ptr_fun、mem_fun、以及mem_fun_ref這些適配器了。“Library 9: Bind 9”對Bind庫進行了全面的介紹。這個庫對於C++標準庫來說是一個重要並且非常有用的補充。Bind通常和標準庫演算法一起使用,也經常和Boost.Function一起使用用以產生一個強有力的工具來儲存任意的函數和函數對象用於隨後的調用。Bind已經被即將到來的標準庫技術報告所採納。
Bind的作者是Peter Dimov。
Boost.Function
Function庫實現了一個通用的回調機制。它可以用來儲存函數指標、函數對象以及成員函數指標並在隨後調用它們。當然,它經常要和諸如Boost.Bind以及Boost.Lambda這樣的綁定器庫一起使用,這可以大大提高回調(包括與自身狀態有關的回呼函數)的使用範圍。這個庫在“Library 11: Function 11”有詳細論述。通常情況下Function被用於需要使用函數指標進行回調的地方。關於它的用法的例子包括signal/slot的實現、GUIs與商務邏輯的分離、以及如何把異構的類似於函數的類型存入標準庫容器。Function已經被即將到來的標準庫技術報告所採納。
Function的作者是Douglas Gregor。
Boost.Functional
Functional庫提供了C++標準庫適配器的增強版本。 它最牛的地方就是解決了使用標準庫綁定器來綁定有一個或多個引用參數的函數的時候,所帶來的關於引用的引用這個問題(這是不合法的)。此外,通過Functional把函數指標和標準庫演算法一起使用的時候,就沒必要再使用ptr_fun了。
Functional的作者是Mark Rodgers。
Boost.Lambda
Lambda庫為C++提供lambda運算式,也就是無名函數(unnamed functions)。它在使用標準庫演算法的時候尤其有用,Lambda允許在調用的地方定義函數,這避免了建立許多小的函數對象。使用lambda運算式意味著寫更少的代碼,而且可以寫在它被用到的地方,這相對於分散在代碼體裡的函數對象來說更加清晰和容易維護。“Library 10: Lambda 10”詳細介紹了這個庫。
Lambda的作者是Jaakko Järvi和Gary Powell。
Boost.Ref
許多函數模板(包括標準C++庫裡面的許多函數模板)都是以傳值的方式接受參數的,有些時候這會有問題。有可能拷貝一個對象的代價過高或者根本不能拷貝,或者對象的狀態與某個特定的執行個體綁定在一起從而拷貝是不切實際的。這些情況下,我們需要一種方法來傳遞引用而不是傳值。Ref給對象外覆一個引用並且把它轉化為一個可能被拷貝的對象。這使得調用函數可以通過一個引用以傳值的方式接受參數。Ref已經被即將到來的標準庫技術報告所採納。
Ref的作者是Jaakko Järvi,Peter Dimov,Douglas Gregor,以及David Abrahams。
Boost.Signals
由訊號及其觀測者(Signals and slots)所組成的系統基於這樣一個模式,這個模式也被成為發行者-訂閱者模式(publisher-subscriber)或者觀察者模式,它們對於以最小的依賴性來管理系統中的事件來說是非常重要的工具。幾乎所有大型的應用程式都使用這個強勁的模式的某種變體,儘管通常他們使用的都是專用的實現。Signals庫提供了已經被證實的並且高效的方法用來把訊號的產生(事件/被觀察者)與需要被通知到的訊號觀測者(訂閱者/觀察者)分離開來。
Signals的作者是Douglas Gregor。