Boost原始碼學習三 實用工具 (3)

2021-07-08 12:35:13 字數 2153 閱讀 6436

第三個學的是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...