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

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

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

前言

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

返回一個(gè)bool值

以下例子純屬虛構(gòu),只為說(shuō)明問(wèn)題,無(wú)實(shí)際意義

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;
}

這個(gè)例子中的函數(shù) getBoolVal 本意是想返回一個(gè) bool 類(lèi)型的判斷結(jié)果,但是函數(shù)中有一些異常情況時(shí),比如申請(qǐng)內(nèi)存異常時(shí),也會(huì)返回一個(gè)bool值,這是與原判斷結(jié)果語(yǔ)義不同的,所以需要單獨(dú)返回這種情況,如果也放到同一個(gè)返回值中會(huì)導(dǎo)致含義模糊,這時(shí)可以考慮使用引用變量參數(shù)來(lái)返回實(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;
}

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

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;
}

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

使用 std::optional 改寫(xiě)

std::optional 本身是一個(gè)模板類(lèi):會(huì)有一個(gè) std::nullopt

template <class T>
class optional;

它內(nèi)部有兩種狀態(tài),要么有一個(gè)T類(lèi)型的值,要么用 std::nullopt 表示沒(méi)有值,查看一個(gè) std::optional 對(duì)象是否有值,可以用 has_value() 進(jìn)行判斷,當(dāng)一個(gè) std::optional 有值時(shí),可以通過(guò)用指針的方式(*號(hào)和->號(hào))來(lái)使用它,或者用 value()函數(shù)取它的值,下面我們用它來(lái)改寫(xiě)一下之前的實(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 類(lèi)型之前的兩態(tài)變成了三態(tài),很多類(lèi)似的邏輯也被封裝成了函數(shù),使用它之后代碼更清晰了,從此可以告別一些煩人的魔法數(shù)了,一些函數(shù)參數(shù)也可以使用 std::optional 來(lái)包裝,用法類(lèi)似,在此就不展開(kāi)說(shuō)了。

總結(jié)

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

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

相關(guān)文章

  • C++回溯法實(shí)例分析

    C++回溯法實(shí)例分析

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    你真的知道C++對(duì)象大小嗎?

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

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

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

最新評(píng)論

康保县| 邵阳市| 呼图壁县| 锡林郭勒盟| 德清县| 海阳市| 马关县| 屯门区| 高陵县| 兴仁县| 白朗县| 房产| 轮台县| 潼关县| 凤庆县| 长汀县| 阜南县| 涿鹿县| 始兴县| 怀来县| 会理县| 辽阳县| 潮安县| 循化| 永新县| 永定县| 共和县| 全州县| 岱山县| 芦山县| 铜山县| 岳阳市| 八宿县| 南康市| 平远县| 大厂| 东丰县| 汝城县| 千阳县| 奇台县| 阜康市|