C++17中新引入了std::optional<T>
。類模板std::optional
管理一個可選的容納值。簡單說來,std::optional
就是一個和類型,常見的用處就是做爲函數返回值來處理一個可能失敗的函數。函數
此前處理無參返回的函數通常有兩種方式。優化
bool foo(int param1, int*param2);
返回參數做爲引用/指針型輸入參數而存在,傳入地址,在執行完畢後訪問指定地址獲得返回值,而使用真正的返回值來做爲函數是否成功的返回。 這種方式能夠實現需求。 缺點是:spa
param2
的空間須要事先分配std::pair<T,bool>foo(int param1);
這是比較經常使用的方式,解決了問題2——每次使用都知道返回值是pair
的第一個值,第二個值專門用於成功與否的判斷。 不過std::optional
繼續優化了處理方式。指針
正如前述,std::optional
管理的是可選的容納值。若是函數成功執行,則實例含值,若是執行失敗,實例不含值。code
這都不是個問題,class
,struct
,哪一個都比直接放在一個tuple
裏面或者更過度的直接列在函數參數裏面好。對象
<optional>
=
用另外一個T
類型含值std::optional
初始化nullopt_t
類型值或是T
類型值bool hasValue=temp.has_value()
檢查是否含值(*temp)
取T
,即默認爲T
的指針temp.value()
獲取T
值temp.value_or()
獲取值(存在值)或者其餘(不存在值)T
對象(非指針)nullopt
{}
//一個可析構類型 class Test{ int num1; int num2; Test(int n1,int n2){ num1=n1; num2=n2; } bool isOK(){ return num1+num2>=0?true:false; } } //一個可能執行失敗的函數【有點草率,看看語法就好 std::optional<Test>foo(int num){ Test t(num,num); if(t.isOK()){ //返回正常對象 return t; } //返回空值 return nullopt; } int main(){ int myAge=20; //一種賦值方式 std::optional<Test>opt=foo(myAge); //一種判斷是否含值的方式 if(opt.has_value()){ //foo函數成功執行 //一種取值方式 cout<<(opt.value()).num1<<endl; } }
cppreference-std::optional 更多特性/支持的操做請訪問 C++17 新特性之 std::optional(上)更好地理解爲什麼使用std::optional請訪問get