|
一直流傳這么一個說法,想成為高手,一定要多讀高手寫的源代碼。哪些代碼是好材料呢?C++標準庫的源代碼?不,如果您讀過,就會發現:要么是各種實現獨有的表達方式讓人摸不著頭腦,要么是恐怖的代碼風格(如到處是下劃線)憋得人難受。Boost庫的代碼則相當清晰,注釋合理,命名規范,絕對是適合閱讀的典范。同時,Boost內容廣泛,數值計算、泛型編程、元編程、平臺API……不妨從容選擇自己感興趣的部分,細細品味。
Boost是什么?一套開放源代碼、高度可移植的C++庫。
誰發起的?C++標準委員會庫工作組。所以,質量保證,不怕遇到假冒偽劣產品。
有些什么呢?瞧瞧:
字符串及文本處理
Boost.Regex 正則表達式是解決大量模式匹配問題的基礎。它們常用于處理大的字符串,子串模糊查找,按某種格式tokenize字符串,或者是基于某種規則修改字符串。由于C++沒有提供正則表達式支持,使得有些用戶被迫轉向其它支持正則表達式的語言,如Perl, awk, 和 sed。Regex提供了高效和強大的正則表達式支持,基于與STL同樣的前提而設計,這使得它很容易使用。Regex已被即將發布的Library Technical Report接受。更多的信息,請見"Library 5: Regex."
Regex 的作者是 Dr. John Maddock.
Boost.Spirit Spirit庫是一個多用途的、遞歸的語法分析器生成框架。有了它,你可以創建命令行分析器,甚至是語言預處理器[1]。它允許程序員直接在C++代碼里使用(近似于)EBNF的語法來指定語法規則。分析器非常難寫,對于一個特定的問題,它們很快就變得難于維護和看懂。而Spirit解決了這些問題,而且達到了與手工制作的分析器一樣或幾乎一樣的性能。
[1] Wave庫使用Spirit實現了一個與C++高度一致的預處理器,就證明了這一點。
Spirit 的作者是 Joel de Guzman, 以及一組熟練的程序員。
Boost.String_algo 這是一組與字符串相關的算法。包括很多有用的算法,用于大小寫轉換,空格清除,字符串分割,查找及替換,等等。這組算法是目前C++標準庫里已有功能的擴展。
String_algo 的作者是 Pavol Droba.
Boost.Tokenizer 這個庫提供了把字符序列分割成記號(token)的方法。通用的語法分析任務包括了在已分割的文本流里查找數據。如果可以把字符序列視為多個元素的容器將很有幫助,容器中的元素被執照用戶定義的規則所分割。語法分析就成為了在這些元素上進行操作的單個任務,Tokenizer正好提供了這種功能。用戶可以決定字符序列如何被分割,在用戶請求新的元素時,庫將找出相應的記號。
Tokenizer 的作者是 John Bandela.
數據結構, 容器, 迭代器, 和算法
Boost.Any Any庫支持類型安全地存儲和獲取任意類型的值。當你需要一個可變的類型時,有三種可能的解決方案:
無限制的類型,如 void*. 這種方法不可能是類型安全的,應該象逃避災難一樣避免它。
可變的類型,即支持多種類型的存儲和獲取的類型。
支持轉換的類型,如字符串類型與整數類型之間的轉換。
Any實現了第二種方案,一個基于值的可變化的類型,無限可能的類型。這個庫通常用于把不同類型的東西存儲到標準庫的容器中。更多的說明請見 "Library 6: Any."
Any 的作者是 Kevlin Henney.
Boost.Array 這個庫包裝了普通的C風格數組,給它們增加了一些來自于標準庫容器的函數和typedef 。其結果就是可以把普通的數組視為標準庫的容器。這非常有用,因為它增加了類型安全性而沒有降低效率,而且它使得標準庫容器和普通數組擁有統一的語法。后一點意味著可以把普通數組用于大多數的要求容器類來操作的函數。當要求軟件要達到普通數組的性能時,可以用Array來替代std::vector.
Array 的作者是 Nicolai Josuttis, 它在Matt Austern 和 Bjarne Stroustrup早期提出的思想之上建立了這個庫。
Boost.Compressed_pair 這個庫包括一個參數化的類型, compressed_pair, 它非常象標準庫中的 std::pair. 與std::pair不同之處在于, boost::compressed_pair 對模板參數進行評估,看其中有沒有空的參數,如果有,使用空類優化技術來壓縮pair的大小。
Boost.Compressed_pair 常用于存放一對對象,其中之一或兩個都可能是空的。
Compressed_pair 的作者是 Steve Cleary, Beman Dawes, Howard Hinnant, 和 John Maddock.
Boost.Dynamic_bitset Dynamic_bitset庫非常象std::bitset, 除了std::bitset 是用參數來指定位數(即容器的大小), 而boost::dynamic_bitset 則支持在運行期指定大小。dynamic_bitset 支持與std::bitset一樣的接口,還增加了支持運行期特定功能的函數和一些std::bitset中沒有的功能。在bitset的大小無法在編譯期確定或在程序運行時可能變化的情況下,這個庫通常用于替換std::bitset。
Dynamic_bitset 的作者是 Jeremy Siek 和 Chuck Allison.
Boost.Graph Graph是一個處理圖結構的庫,它的設計受到STL的重要影響。它是泛型的,高度可配置,并且包括多個不同的數據結構:鄰接鏈表, 鄰接矩陣, 和邊列表。Graph還提供了大量的圖算法,如Dijsktra最短路徑算法,Kruskal最小生成樹算法,拓樸邏輯排序,等等。
Graph 的作者是 Jeremy Siek, Lie-Quan Lee, 和 Andrew Lumsdaine.
Boost.Iterator 這個庫提供一個創建新的迭代器類型的框架,還提供了許多有用的迭代器適配器,比C++標準中定義的更多。創建遵循標準的新迭代器類型是一件困難且乏味的工作。Iterator通過自動完成大多數細節,如提供所需的 typedef,簡化了這件工作。Iterator還可以改編已有的迭代器類型以賦于它新的行為。例如,間接迭代器適配器增加了一個額外的解引用操作,可以把一個包含某種對象的指針(或智能指針)的容器變成象一個包含該對象的容器。
Iterator 的作者是 Jeremy Siek, David Abrahams, 和 Thomas Witt.
Boost.MultiArray MultiArray提供了一個多維容器,它很象標準庫的容器,但比向量的向量更有效、更高效,更直接。容器的維數在聲明時指定,但它支持限制(slicing)和映身(projecting)不同的視圖(view),也可以在運行期改變維數。
MultiArray 的作者是 Ronald Garcia.
Boost.Multi-index Multi-index為底層的容器提供多個索引。這意味著一個底層的容器可以有不同的排序方法和不同的訪問語義。當std::set 和 std::map不夠用時,就可以用Boost.Multi-index,通常是在需要為查找元素而維護多個索引時。
Multi-index 的作者是 Joaquín M López Muñoz.
Boost.Range 這個庫是一組關于范圍的概念和工具。比起在算法中使用一對迭代器來指定范圍,使用ranges更簡單,并提升了用戶代碼的抽象水平。
Range 的作者是 Thorsten Ottosen.
Boost.Tuple 在標準C++中有Pairs(類模板 std::pair), 但它不支持n-tuples。用Tuple.不象用structs 或 classes 來定義n-tuples, 這個類模板支持直接聲明和使用,如函數返回類型或參數,并提供一個泛型的方法來訪問tuple的元素。關于這個庫的詳細信息,請見"Library 8: Tuple 8"。Tuple已經被即將發布的Library Technical Report所接受。
Tuple 的作者是 Jaakko Järvi.
Boost.Variant Variant庫包含一個不同于union的泛型類,用于在存儲和操作來自于不同類型的對象。這個庫的一個特點是支持類型安全的訪問,減少了不同數據類型的類型轉換代碼的共同問題。
Variant 的作者是 Eric Friedman 和 Itay Maman.
函數對象及高級編程
Boost.Bind Bind是對標準庫的綁定器bind1st 和 bind2nd的泛化。這個庫支持使用統一的語法將參數綁定到任何類似于函數行為的東西,如函數指針、函數對象,以及成員函數指針。它還可以通過嵌套綁定器實現函數組合。這個庫不要求那些對標準庫綁定器的強制約束,最顯著的就是不要求你的類提供typedefs result_type, first_argument_type, 和 second_argument_type 等。這個庫也使得我們不再需要用 ptr_fun, mem_fun, 和 mem_fun_ref 等適配器。Bind庫的說明在"Library 9: Bind 9."。它是對C++標準庫的一個重要且很有用的擴充。Bind可以被標準庫的算法使用,也經常用于Boost的函數,它提供了一個強大的工具,用于存放后續調用的函數和函數對象。Bind 已被即將發布的Library Technical Report所接受。
Bind 的作者是 Peter Dimov.
Boost.Function Function庫實現了一個泛型的回調機制。它提供了函數指針、函數對象和成員函數指針的存儲和后續的調用。當然,它與binder庫,如Boost.Bind 和 Boost.Lambda一起工作,大大提高了回調(包括帶態度的回調函數)的使用機會。這個庫的詳細介紹請見"Library 11: Function 11."。Function常用于需要把函數指針用于回調的地方。例如:信號/接收者的實現,GUI與業務邏輯的分離,以及在標準庫容器中存儲不同的類函數類型。Function已被即將發布的Library Technical Report所接受。
Function 的作者是 Douglas Gregor.
Boost.Functional Functional庫提供C++標準庫的適配器的加強版。主要的優勢是它有助于解決引用到引用(這是非法的)的問題,這個問題是由對帶有一個或多個引用參數的函數使用標準庫的綁定器所引起的。Functional同時消除了在標準庫算法中使用函數指針時必須用ptr_fun的問題。
Functional 的作者是 Mark Rodgers.
Boost.Lambda Lambda為C++提供lambda表達式及無名函數。在使用標準庫算法時特別好用,Lambda允許函數在呼叫點創建,避免了創建多個小的函數對象。使用lambdas意味著更少的代碼,在哪需要就在哪寫,這比分散在代碼各處的函數對象更清晰、更好維護。"Library 10: Lambda 10" 詳細討論了這個庫。
Lambda 的作者是 Jaakko Järvi 和 Gary Powell.
Boost.Ref 許多函數模板,包括大量標準C++庫里的函數模板,它們的參數采用傳值的方式傳遞,有時候會有問題。復制一個對象可能很昂貴或者甚至不可能,或者狀態可能取決于特寫的實例,因此這時復制是不希望的。在這些情況下,可用的辦法是用引用傳遞取代值傳遞。 Ref包裝了一個對象的引用,并把它放入一個對象以便被復制。這就允許了通過引用去調用那些采用傳值參數的函數。Ref 已被即將發布的Library Technical Report所接受。
Ref 的作者是 Jaakko Järvi, Peter Dimov, Douglas Gregor, 和 David Abrahams.
Boost.Signals 信號和接收系統,基于稱為publisher-subscriber 和 observer的模式,它是在一個最小相關性系統中管理事件的重要工具。很少有大型應用軟件不采用這種強大設計模式的某種變形,盡管他們有各自的實現方式。Signals提供了一個已驗證的、高效的手段,將信號(events/subjects)的發生和這些信號要通知的接收者(subscribers/observers)進行了分離。
Signals 的作者是 Douglas Gregor.
泛型編程與模板元編程
Boost.Call_traits 這個庫提供了傳遞參數給函數的最好方法的自動演繹,依據參數的類型。例如,當傳遞的是如int 和 double這樣的內建類型,最高效的方式是傳值。對于用戶自定義類型,則傳送const引用通常更好。Call_traits為你自動選擇正確的參數類型。這個庫還有助于聲明參數為引用,而不用冒引用到引用的風險(在C++這是非法的)。Call_traits常用于要求以最高效方式傳遞參數而又不知道參數類型的泛型函數,并避免引用到引用的問題。
Call_traits 的作者是 Steve Cleary, Beman Dawes, Howard Hinnant, 和 John Maddock.
Boost.Concept_check Concept_check提供一些類模板,用于測試特定的概念(需求的集合)。泛型(參數化的)代碼要求實例化時的類型必須符合某些抽象概念,如LessThanComparable. 這個庫提供了一些方法來明確地聲明模板的參數化類型的特定需求。代碼的用戶可以獲益,由于需求的文檔化以及編譯器可以產生錯誤信息以明確指出類型不符合這些概念的地方。Boost.Concept_check提供了超過30個可用于泛型代碼的概念,其中一些原型可用于校驗包括所有相關概念的組件的實現。它用于在泛型代碼中聲明和證明概念的需求。
Concept_check 的作者是 Jeremy Siek, 他從Alexander Stepanov and Matt Austern的前期工作中得到靈感。
Boost.Enable_if Enable_if允許函數模板或類模板的特化體包括/排除在一組匹配的函數或特化體之中/之外。主要的用例是包括/排除基于某些特性的特化體。例如,僅當采用一個整數類型實例化時使能一個函數模板。這個庫還為SFINAE(substitution failure is not an error)提供了一個非常有用的研究機會。
Enable_if 的作者是 Jaakko Järvi, Jeremiah Willcock, 和 Andrew Lumsdaine.
Boost.In_place_factory In_place_factory庫是一個直接構造所含對象的框架,包括用于初始化的可變參數列表。它可以消除對所含類型必須是CopyConstructible的要求,并減少了創建不必要的臨時對象的需要,該臨時對象僅用于提供復制所需的源對象。這個庫有助于減少傳送用于對象初始化的參數所需的工作量。
In_place_factory 的作者是 Fernando Cacciola.
Boost.Mpl Mpl是一個模板元編程庫。它包含了與C++標準庫十分相象的數據結構和算法,但它們是在編譯期使用的。甚至有編譯期的lambda表達式支持!提供編譯期的操作,如產生類型或操作類型序列,在現代C++中越來越普遍,而提供這些功能的庫是非常重要的工具。就我所知,還沒有其它象Mpl這樣的庫。它填充了C++元編程世界的空白。我可以告訴你在你讀本書時有一本關于Boost.Mpl的書正在創作,它就快要面世了,它就是Aleksey Gurtovoy 和 David Abrahams所著的C++ Template Metaprogramming。你應該盡快獲得一本。
Mpl 的作者是 Aleksey Gurtovoy, 并有許多其它人的重要貢獻。
Boost.Property_map Property_map是一個概念庫而不是一個真正的實現。它引入了 property_map 概念以及property_map類型的一組要求,從而給出了對一個key和一個value的映射的語法和語義要求。這在需要聲明必須支持的類型的泛型代碼中很有用。C++數組是一個property_map的例子。這個庫包含了Boost.Concept_check可以測試的概念的定義。
Property_map 的作者是 Jeremy Siek.
Boost.Static_assert 進行編譯期編程的一個公共的需求是提供靜態斷言,即編譯期斷言。另外,獲得一致的錯誤提示不是必然的,由于靜態斷言必須會產生失敗斷言的信號,跨不同的編譯器。Static_assert提供對名字空間、類、函數作用域的靜態斷言的支持。詳細信息見"Library 3: Utility."
Static_assert 的作者是 Dr. John Maddock.
Boost.Type_traits 成功的泛型編程通常需要根據參數化類型進行決策或調整這些類型的屬性(如cv-qualification[2])。Type_traits提供關于類型的編譯期信息,如某個類型是否指針或引用,以及增加或去除類型基本屬性。Type_traits已被加入即將發布的Library Technical Report。
[2] 一個類型可以是cv-unqualified (非 const 或 volatile), const-qualified (const), volatile-qualified (聲明為 volatile), or volatile-const-qualified (既 const 并 volatile); 類型的這些版本都是獨特的。
Type_traits 的作者是 Steve Cleary, Beman Dawes, Aleksey Gurtovoy, Howard Hinnant, Jesse Jones, Mat Marcus, John Maddock, 和 Jeremy Siek, 以及其它許多人的貢獻。
數學及數字處理
Boost.Integer 這個庫提供了對整數類型的有用功能,如編譯期的最小、最大值常數[3],基于給定位長的合適大小的類型,靜態二進制對數計算等等。還包括從1999年C標準頭文件<stdint.h>中的typedef。
[3] std::numeric_limits 僅能以函數方式提供這些值。
Integer 的作者是 Beman Dawes 和 Daryle Walker.
Boost.Interval Interval庫幫助你使用數學區間。它提供類模板interval及相關算子。區間的常見用法(除了明顯的進行區間計算的情況)是提供模糊結果的計算;區間的使用可以量化舍入誤差的傳播情況。
Interval 的作者是 Guillaume Melquiond, Sylvain Pion, 和 Hervé Brönniman, 該庫從 Jens Maurer的前期工作獲得靈感。
Boost.Math Math是一組數學模板:quaternions 和 octonions (復數的特化);數學函數如acosh, asinh, 和 sinhc;計算最大公約數(GCD)和最小公倍數(LCM)的函數等等。
Math 的作者是 Hubert Holin, Daryle Walker, 和 Eric Ford.
Boost.Minmax Minmax可以同時計算最小和最大值,而使用std::min 和 std::max則要兩次比較。對于n個元素的情況,只要3n/2+1次比較,而使用std::min_element 和 std::max_element則需要2n次比較。
Minmax 的作者是 Hervé Brönniman.
Boost.Numeric Conversion Numeric Conversion庫是一組用于在不同數字類型的值之間進行安全及可預言的轉換的工具。例如,有一個名為numeric_cast (最早來自于Boost.Conversion)的工具,提供了范圍檢測的轉換以確定數值可被目標類型所表示,否則它會拋出異常。
Numeric Conversion 的作者是 Fernando Cacciola.
Boost.Operators Operators庫提供了相關操作符及概念(LessThanComparable, Arithmetic,等等)的實現。定義一個類型的操作符時,保證所有操作符都有定義是一件乏味并容易出錯的工作。例如,你提供了operator< (LessThanComparable),通常都要同時提供operator<=, operator>, 和 operator>= 。Operators可以根據給定類型的最小的用戶自定義操作符集合,自動聲明并定義其它所有的相關操作符。詳細討論見"Library 4: Operators 4."
Operators 的作者是 David Abrahams, Jeremy Siek, Aleksey Gurtovoy, Beman Dawes, 和 Daryle Walker.
Boost.Random 這是一個對隨機數的專業使用的庫,包括大量的生成器和分配器,可適用于多個不同的領域,如仿真和加密。Random已被收入即將發布的Library Technical Report.
Random 的作者是 Jens Maurer.
Boost.Rational 整數類型和浮點數類型都內建成于C++語言,復數類型也是C++標準庫的一部分,但有理數類型呢?有理數可以避免浮點數的精度損失問題,因此它們常被用于計算金錢等。Rational提供的有理數類型可以基于任意整數類型,包括用戶自定義的整數類型(具有無限精度的類型顯然是很有用的).
Rational 的作者是 Paul Moore.
Boost.uBLAS uBLAS庫使用數學符號提供對向量和矩陣的基本線性代數操作,采用操作符重載,它可以生成緊湊的代碼(使用表達式模板)。
uBLAS 的作者是 Joerg Walter 和 Mathias Koch.
輸入/輸出
Boost.Assign Assign幫助你把一系列的值賦給容器。它通過對operator, (逗號操作符) and operator()() (函數調用操作符)的重載,帶給用戶一種數據賦值的很容易的方法。除了對原型風格的代碼特別有用,這個庫的功能在其它時候也很有用,使用這個庫有助于提高代碼的可讀性。使用本庫中的list_of還可以就地生成無名數組。
Assign 的作者是 Thorsten Ottosen.
Boost.Filesystem Filesystem庫提供對路徑、目錄和文件操作的可移植性。這種高級抽象使C++程序員可以寫出類似于其它編程語言腳本的代碼。它提供了便于操作目錄和文件的算法。編寫要在不同文件系統平臺間移植代碼的困難工作由于這個庫的幫助變得容易了。
Filesystem 的作者是 Beman Dawes.
Boost.Format 這個library加入了按格式化串進行格式化的功能,類似于printf, 但增加了類型安全性。相反使用具有相同便利性的printf的最主要問題是參數類型的危險;它不保證格式化串中指定的類型與實際的參數類型是匹配的。除了消除了這種不匹配性的危險以外,Format還可以用于格式化用戶自定義的類型。[4]
[4] 格式化函數用省略號表示可變數量的參數是不可以的。
Format 的作者是 Samuel Krempp.
Boost.Io_state_savers Io_state_savers庫允許保存IOStream對象的狀態,用于以后的恢復,以取消可能發生的任何狀態的變化。許多操縱器會永久改變它們操作的流的狀態,這可能是你不想要的,而手工重置狀態又容易出錯。這個狀態保存器可以保存控制標志、精度、寬度、異常掩碼、流的locale等等。
Io_state_savers 的作者是 Daryle Walker.
Boost.Serialization 這個庫允許任意的C++數據結構存進來,再取出去,以及存檔。例如,存檔可以是文本文件或XML文件。Boost.Serialization是高度可移植的,并提供了非常成熟的特性,如類的版本、C++標準庫中的通用類的序列化、共享數據的序列化,等等。
Serialization 的作者是 Robert Ramey.
雜項
Boost.Conversion Conversion庫包含有一些函數,它們是現有的強制類型轉換操作符(static_cast, const_cast, 和 dynamic_cast)的增強。Conversion為安全的多態轉換增加了 polymorphic_cast 和 polymorphic_downcast,為安全的數字類型轉換增加了 numeric_cast,為文本轉換(如string 和 double間的轉換)增加 lexical_cast。你可為了你自己的類型更好地工作而定制這些類型轉換,可能這些類型并不可以使用語言本身所提供的類型轉換。這個庫的詳細討論在"Library 2: Conversion."
Conversion 的作者是 Dave Abrahams 和 Kevlin Henney.
Boost.Crc Crc庫提供了循環冗余碼(CRC)的計算,常有于校驗和類型。CRC被加到一個數據流中(它就是從這些數據中計算得來的),用來對這些數據進行校驗,例如PKZip就使用了CRC32。這個庫包含了四個CRC類型:crc_16_type, crc_ccitt_type, crc_xmodem_type, 和 crc_32_type5.
Crc 的作者是 Daryle Walker.
Boost.Date_time Date_time庫提供了對日期和時間類型及對它們的操作的廣泛支持。如果沒有對日期和時間的支持,程序開發任務會變得復雜并容易出錯。使用Date_time,你想要的所有自然概念都被支持:日、周、月、持續時間(及時間間隔)、加、減等等。這個庫還提供了其它日期/時間庫所忽略的東西,如閏秒處理以及高精度時間源的支持。這個庫的設計是可擴展的,允許客戶化定制行為或添加功能。
Date_time 的作者是 Jeff Garland.
Boost.Optional 要求函數可以指出它的返回值無效是一個很普通的要求,但通常返回類型并不存在某個狀態來表示其無效。Optional提供了類模板optional, 它是一個在語義上有額外狀態的類型,它可以有效地表明optional的實例是否包含被封裝對象實例。
Optional 的作者是 Fernando Cacciola.
Boost.Pool Pool庫提供了一個內存池分配器,它是一個工具,用于管理在一個獨立的、大的分配空間里的動態內存。當你需要分配和回收許多不的對象或需要更高效的內存控制時,使用內存池是一個好的解決方案。
Pool 的作者是 Steve Cleary.
Boost.Preprocessor 當你要表示象循環這樣的結構時,很難使用預處理器,它沒有容器,不提供迭代器,等等。然而預處理器仍是一個強大的可移植的工具。Preprocessor庫提供了在預處理器之上的抽象。它包括lists, tuples, 和 arrays, 還有操作這些類型的algorithms。這個庫有助于減少重復的代碼,減輕你的負擔,也使得代碼更易讀、更清晰、更具可維護性。
Preprocessor 的作者是 Vesa Karvonen 和 Paul Mensonides.
Boost.Program_options Program_options庫提供了程序選項配置(名字/值對), 程序選項通常是通過命令行參數或配置文件提供。這個庫減輕了程序員手工分析這些數據的負擔。
Program_options 的作者是 Vladimir Prus.
Boost.Python Python庫提供了C++與Python[6]的互操作性。它用于將C++類及函數提供給Python,同樣把Python對象給C++。它是非插入式的,也就是說已有代碼無需修改即可用于Python。
[6] 一種你應該知道的非常流行的編程語言。
Python 的作者是 David Abrahams, 并得到Joel de Guzman 和 Ralf W. Grosse-Kunstleve的重要貢獻。
Boost.Smart_ptr 智能指針是任何一個程序員工具包中的重要部分。它們用于防止資源泄漏、共享資源、對象生存期管理。有很多好的智能指針庫可用,有些是免費的,而有些是商業軟件包的組成部分。Smart_ptr是其中的佼佼者,已被成千上萬的用戶所證實,并被該領域的專家所推薦。 Smart_ptr包括了非插入的智能指針用于限制范圍(scoped_ptr 和 scoped_array),用于共享資源(shared_ptr 和 shared_array), 一個配合shared_ptr使用的智能指針(weak_ptr), 還有一個插入式的智能指針類(intrusive_ptr). Smart_ptr的shared_ptr (包括它的助手enable_shared_from_this) 以及 weak_ptr 已被收入即將發布的Library Technical Report。關于智能指針更詳細的說明請見"Library 1: Smart_ptr 1."
Smart_ptr 的作者是 Greg Colvin, Beman Dawes, Peter Dimov, 和 Darin Adler.
Boost.Test Test庫提供了一整組用于編寫測試程序的組件,可以把測試組織成簡單的測試用例及測試套裝,并控制它們的執行。作為這個庫的一個組件,程序執行監視器在某些生產(非測試)環境下也很有用。
Test 的作者是 Gennadiy Rozental (基于Beman Dawes早期的工作).
Boost.Thread 可移植的線程是很難處理的業務,也無法從C++本身獲取幫助,因為語言本身不包括線程支持。當然,我們有POSIX, 它在許多平臺上可用,但POSIX使用的是C API。Thread是一個提供可移植線程的庫,它包含大量線程的原始概念和高度抽象。
Thread 的作者是 William Kempf.
Boost.Timer Timer庫包含計時所需的特性,它的目標是盡可能做到跨平臺的一致性。雖然每個平臺都有特定的 API可以讓程序員用于計時,但對于高精度計時還沒有可移植的方案。Boost.Timer通過提供最大可能的精度并同時保留可移植性解決了這個問題,從而可以讓你自由地確定精度。
Timer 的作者是 Beman Dawes.
Boost.Tribool 這個庫包含一個 tribool 庫,它實現了三狀態布爾邏輯。三狀態布爾類型除了true 和 false以外還有一個額外的狀態:indeterminate (這個狀態也被稱為maybe; 這個名字是可配置的).
Tribool 的作者是 Douglas Gregor.
Boost.Utility 一些本不應在一個庫里出現的有用的東西,只是因為它們每個都不太復雜和廣泛,不足夠形成一個單獨的庫。但不是說它們沒有什么用外;事實上小的工具通常都有最廣泛的用處。在Boost, 這些小工具被集中起來,形成一個稱為Utility的庫。你可以在這找到checked_delete, 一個函數,用于確認在刪除點的類型是完整的;還有類noncopyable,用于確保類不能被復制;還有enable_if,用于對函數重載的完全控制。還有其它很多工具,詳細請見"Library 3: Utility"。
Utility 的作者是 David Abrahams, Daryle Walker, Douglas Gregor, 和其它人。
Boost.Value_initialized Value_initialized庫幫助你用泛型的方法構造和初始化對象。在C++里,一個新構造的對象可以是零初始化的、缺省構造的,或是不確定的,這依賴于對象的類型。有了Boost.Value_initialized, 這種不一致的問題就沒有了。
Value_initialized 的作者是 Fernando Cacciola.
|