第三個學的是optional,按照boost程式庫開發指南中的介紹:
optional的類摘要:
template < class t>
class optional
;
optional庫使用"容器"語義,包裝了"可能產生無效值"的物件,實現了"未初始化"的概念.
#include
using namespace boost;
"無意義"的值:
函式並不總能返回有效的返回值,很多時候函式可能返回"無意義"的值,這不意味著函式執行失敗,而是表明函式正確執行了,但結果卻不是有用的值。
表示返回值無意義最常用的做法是增加乙個"哨兵"的角色,它位於解空間之外,如null,-1,eof,string::npos,vector::end()等。但這些做法不夠通用,而且很多時候不存在解空間之外的"哨兵".
optional使用"容器"語義,為這種"無效值"的情形提供了乙個較好的解決方案。
optional很像乙個僅能存放乙個元素的容器,它實現了"未初始化"的概念:如果元素未初始化,那麼容器就是空的,否則,容器內就是有效的,已經初始化的值。
optional的真實介面很複雜,因為它要能夠包裝任何的型別。
操作函式:
optional的模板型別引數t可以使任何型別,就如同乙個標準容器對元素的要求,並不需要t具有預設建構函式,但必須是可拷貝構造的。
可以有很多方式建立optional物件,例如:
無參的optional()或者optional(boost::none)構造乙個未初始化optional物件,引數boost::none是乙個類似空指標的none_t型別常量,表示未初始化;
optional(v)構造乙個已初始化的optional物件,其值為v的拷貝。如果模板型別為t&,那麼optional內部持有對引用的包裝;
optional(condition, v)根據條件condition來構造optional物件,如果條件成立(true)則初始化為v,否則為未初始化;
此外optional還支援拷貝構造和賦值操作,可以從另乙個optional物件構造。當想讓乙個optional物件重新恢復到未初始化狀態時,可以向物件賦none值;
optional採用了指標語義來訪問內部儲存的元素,這使得optional未初始化時的行為就像乙個空指標。它過載了operator*和operator->以實現與指標相同的操作,get()和get_ptr()可以以函式的操作形式獲得元素的引用和指標。
成員函式get_value_or(default)是乙個特別的訪問函式,可以保證返回乙個有效的值,如果optional已初始化,那麼返回內部的元素,否則返回default。
optional也可以用隱式型別轉換進行bool測試(用於條件判斷),就像乙個隊指標的判斷。
optional還全面支援比較運算,包括==,!=,<,<,>,>=。與普通指標比較的"淺比較"(僅比較指標值)不同,optional的比較是"深比較",同時加入了對未初始化情況的判斷。
用法:
#include #include using namespace std;
#define boost_disable_asserts
#include using namespace boost;
//void case1()
//void case2()
) << endl;
optionalops("test");
cout << *ops << endl;
ops.emplace("monado", 3);
assert(*ops == "mon");
vectorv(10);
optional& > opv(v);
assert(opv);
opv->push_back(5);
assert(opv->size() == 11);
opv = none;
assert(!opv);}//
optionalcalc(int x)
optionalsqrt_op(double x)
void case3()
d = sqrt_op(-10);
if (!d)
}//void case4()
//int main()
Boost原始碼學習三 實用工具 (2)
第二個學習的是ignore unused,template inline void ignore unused ts const ignore unused使用可變引數模板,可以支援任意數量,任意型別的變數,把它們作為函式的引數 使用 了一下,騙過了編譯器,達到了與 void var相同的效果。in...
Boost原始碼學習三 實用工具 (4)
第四個是assign,include using namespace std include assign 許多情況下我們都需要為容器初始化或者賦值,填入大量的資料,比如初始錯誤 和錯誤資訊,或者是一些測試用的資料。stl容器僅提供了容納這些資料的方法,但填充的步驟卻是相當地麻煩,必須重複呼叫ins...
boost之實用工具
1.noncopyable用於禁止複製和拷貝的類繼承。宣告拷貝和賦值函式為私有,將執行時的錯誤轉化為編譯期的錯誤。include include using namespace std using namespace boost class mynoncopy private mynoncopy c...