最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++17使用std::optional表示可能存在的值

 更新時間:2022年07月20日 15:36:43   作者:AlbertS  
本文主要介紹了C++17使用std::optional表示可能存在的值,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

平時寫代碼會遇到一種傳遞參數(shù)特殊值標(biāo)記特殊流程,或者函數(shù)返回值存在魔法數(shù)的情況,很需要一種標(biāo)記參數(shù)或返回值狀態(tài)的結(jié)構(gòu),那么在 C++17 標(biāo)準(zhǔn)下提供了 std::optional 這個模板類,可以表示一個值不存在的狀態(tài),一起來看看用法吧。

返回一個bool值

以下例子純屬虛構(gòu),只為說明問題,無實際意義

bool getBoolVal(int a, int b)
{
? ? int* n = new int;
? ? if (!n)
? ? ? ? return false;

? ? *n = 1;

? ? if (a + *n > b)
? ? ? ? return true;
? ? else
? ? ? ? return false;
}

int main()
{
? ? if (getBoolVal(10, 9))
? ? ? ? std::cout << 1 << std::endl;
? ? else
? ? ? ? std::cout << 1 << std::endl;

? ? return 0;
}

這個例子中的函數(shù) getBoolVal 本意是想返回一個 bool 類型的判斷結(jié)果,但是函數(shù)中有一些異常情況時,比如申請內(nèi)存異常時,也會返回一個bool值,這是與原判斷結(jié)果語義不同的,所以需要單獨返回這種情況,如果也放到同一個返回值中會導(dǎo)致含義模糊,這時可以考慮使用引用變量參數(shù)來返回實際比較結(jié)果。

bool getBoolVal(int a, int b, bool& ret)
{
? ? int* n = new int;
? ? if (!n)
? ? ? ? return false;

? ? *n = 1;

? ? if (a + *n > b)
? ? ? ? ret = true;
? ? else
? ? ? ? ret = false;

? ? return true;
}

int main()
{
? ? bool ret = false;
? ? if (getBoolVal(10, 9, ret))
? ? ? ? std::cout << "error" << std::endl;
? ? else
? ? {
? ? ? ? if (ret)
? ? ? ? ? ? std::cout << 1 << std::endl;
? ? ? ? else
? ? ? ? ? ? std::cout << 0 << std::endl;
? ? }

? ? return 0;
}

這個引用參數(shù) ret 使用起來有點不方便,那把兩個值都返回怎么樣,雖然C++不允許有多個返回值,但可以把它們包裝成 std::pair 或者 std::tuple 來返回,再來改寫一下:

std::pair<bool, bool> getBoolVal3(int a, int b)
{
? ? int* n = new int;
? ? if (!n)
? ? ? ? return {false, false};

? ? *n = 1;

? ? if (a + *n > b)
? ? ? ? return {true, true};
? ? else
? ? ? ? return {true, false};
}

int main()
{
? ? auto [err, ret] = getBoolVal(10, 9);
? ? if (err)
? ? ? ? std::cout << "error" << std::endl;
? ? else
? ? {
? ? ? ? if (ret)
? ? ? ? ? ? std::cout << 1 << std::endl;
? ? ? ? else
? ? ? ? ? ? std::cout << 0 << std::endl;
? ? }

? ? return 0;
}

這種方法把實際的返回值,搭配一個表示狀態(tài)的 bool 變量,組成 std::pair 進行返回,基本上得到而來語義明確的目的,但是看起來還是不太優(yōu)雅,而 std::optional 可以幫助我們實現(xiàn)類似的需求,并且代碼看起來能更簡潔一點。

使用 std::optional 改寫

std::optional 本身是一個模板類:會有一個 std::nullopt

template <class T>
class optional;

它內(nèi)部有兩種狀態(tài),要么有一個T類型的值,要么用 std::nullopt 表示沒有值,查看一個 std::optional 對象是否有值,可以用 has_value() 進行判斷,當(dāng)一個 std::optional 有值時,可以通過用指針的方式(*號和->號)來使用它,或者用 value()函數(shù)取它的值,下面我們用它來改寫一下之前的實現(xiàn):

std::optional<bool> getBoolVal4(int a, int b)
{
? ? int* n = new int;
? ? if (!n)
? ? ? ? return std::nullopt;

? ? *n = 1;

? ? if (a + *n > b)
? ? ? ? return true;
? ? else
? ? ? ? return false;
}


int main()
{
? ? std::optional<bool> ret = getBoolVal(10, 9);
? ? if (ret.has_value())
? ? ? ? std::cout << "error" << std::endl;
? ? else
? ? {
? ? ? ? if (ret.value())
? ? ? ? ? ? std::cout << 1 << std::endl;
? ? ? ? else
? ? ? ? ? ? std::cout << 0 << std::endl;
? ? }

? ? return 0;
}

使用了 std::optional 之后就把 bool 類型之前的兩態(tài)變成了三態(tài),很多類似的邏輯也被封裝成了函數(shù),使用它之后代碼更清晰了,從此可以告別一些煩人的魔法數(shù)了,一些函數(shù)參數(shù)也可以使用 std::optional 來包裝,用法類似,在此就不展開說了。

總結(jié)

  • std::optional 是一個模板類,可以表示一個可能存在的值
  • std::optional 的內(nèi)部有兩種狀態(tài),要么表示一個T類型的值,要么用 std::nullopt 表示沒有值
  • 可以用 has_value() 判斷一個 std::optional 是否有值,然后用 value() 函數(shù)取它表示的值

到此這篇關(guān)于C++17使用std::optional表示可能存在的值的文章就介紹到這了,更多相關(guān)C++17 std::optional內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++回溯法實例分析

    C++回溯法實例分析

    這篇文章主要介紹了C++回溯法,實例講述了回溯法的原理與實現(xiàn)方法,最后給出了回溯法解決八皇后的實例,需要的朋友可以參考下
    2014-09-09
  • 詳解C++中函數(shù)模板的定義與使用

    詳解C++中函數(shù)模板的定義與使用

    函數(shù)模板實質(zhì)就是參數(shù)化數(shù)據(jù)類型,稱這種編程模式為數(shù)據(jù)類型泛化編程。本文將通過示例來和大家一起了解下C++中函數(shù)模板的定義與使用,需要的可以參考一下
    2022-09-09
  • C++中函數(shù)模板的用法詳細(xì)解析

    C++中函數(shù)模板的用法詳細(xì)解析

    所謂函數(shù)模板實際上是建立一個通用函數(shù),其涵涵素類型額形參類型不具體指定,用一個虛擬的類型來代表,這個通用函數(shù)就稱為函數(shù)模板
    2013-10-10
  • C語言簡明清晰講解結(jié)構(gòu)體

    C語言簡明清晰講解結(jié)構(gòu)體

    C語言結(jié)構(gòu)體(Struct)從本質(zhì)上講是一種自定義的數(shù)據(jù)類型,只不過這種數(shù)據(jù)類型比較復(fù)雜,是由 int、char、float 等基本類型組成的。你可以認(rèn)為結(jié)構(gòu)體是一種聚合類型
    2022-05-05
  • C++靜態(tài)變量,常量的存儲位置你真的了解嗎

    C++靜態(tài)變量,常量的存儲位置你真的了解嗎

    這篇文章主要介紹了C++中靜態(tài)變量與常量的存儲位置的相關(guān)資料,需要的朋友可以參考下,希望能夠給你帶來幫助
    2021-08-08
  • C++超詳細(xì)講解逗號操作符

    C++超詳細(xì)講解逗號操作符

    使用逗號運算符是為了把幾個表達式放在一起。整個逗號表達式的值為系列中最后一個表達式的值。從本質(zhì)上講,逗號的作用是將一系列運算按順序執(zhí)行
    2022-05-05
  • LintCode-排序列表轉(zhuǎn)換為二分查找樹分析及實例

    LintCode-排序列表轉(zhuǎn)換為二分查找樹分析及實例

    這篇文章主要介紹了LintCode-排序列表轉(zhuǎn)換為二分查找樹分析及實例的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • C++ 中的new 和 delete 運算符及new和malloc的區(qū)別解析

    C++ 中的new 和 delete 運算符及new和malloc的區(qū)別解析

    在C++中,又引出了一個新玩法:new 和 delete,在C++中,new是用來動態(tài)開辟內(nèi)存的,delete是用來釋放我們所動態(tài)開辟的內(nèi)存C++中的new和delete運算符及new和malloc的區(qū)別解析,感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • 你真的知道C++對象大小嗎?

    你真的知道C++對象大小嗎?

    這篇文章主要給大家介紹了關(guān)于C++對象大小的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • C++ 超全面講解多態(tài)

    C++ 超全面講解多態(tài)

    這篇文章主要介紹了C++多態(tài)的原理與實現(xiàn),多態(tài)是一種面向?qū)ο蟮脑O(shè)計思路,本身和C++不是強綁定的,其他語言當(dāng)中一樣有多態(tài),只不過實現(xiàn)的方式可能有所不同。下面來一起了解更多詳細(xì)內(nèi)容吧
    2022-04-04

最新評論

施甸县| 金乡县| 宁陵县| 望奎县| 手机| 嘉荫县| 潜江市| 平遥县| 弥渡县| 阿尔山市| 台中县| 晋江市| 灵宝市| 英山县| 夏邑县| 辉县市| 阜南县| 赫章县| 宜君县| 图木舒克市| 阳信县| 莲花县| 吉水县| 瑞金市| 溧水县| 剑阁县| 泉州市| 大化| 台江县| 叙永县| 北碚区| 安义县| 井研县| 登封市| 乐昌市| 仙桃市| 彩票| 呼玛县| 丹棱县| 泰来县| 图木舒克市|