欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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í)寫代碼會(huì)遇到一種傳遞參數(shù)特殊值標(biāo)記特殊流程,或者函數(shù)返回值存在魔法數(shù)的情況,很需要一種標(biāo)記參數(shù)或返回值狀態(tài)的結(jié)構(gòu),那么在 C++17 標(biāo)準(zhǔn)下提供了 std::optional 這個(gè)模板類,可以表示一個(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 類型的判斷結(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)改寫一下:

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)能更簡(jiǎn)潔一點(diǎn)。

使用 std::optional 改寫

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

template <class T>
class optional;

它內(nèi)部有兩種狀態(tài),要么有一個(gè)T類型的值,要么用 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)改寫一下之前的實(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 來(lái)包裝,用法類似,在此就不展開說(shuō)了。

總結(jié)

  • std::optional 是一個(gè)模板類,可以表示一個(gè)可能存在的值
  • std::optional 的內(nèi)部有兩種狀態(tài),要么表示一個(gè)T類型的值,要么用 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)文章

  • 詳解原碼、反碼與補(bǔ)碼存儲(chǔ)與大小

    詳解原碼、反碼與補(bǔ)碼存儲(chǔ)與大小

    這篇文章主要介紹了詳解原碼、反碼與補(bǔ)碼存儲(chǔ)與大小的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • C語(yǔ)言實(shí)現(xiàn)打印楊輝三角的方法詳細(xì)(三種方法)

    C語(yǔ)言實(shí)現(xiàn)打印楊輝三角的方法詳細(xì)(三種方法)

    楊輝三角是中國(guó)古代數(shù)學(xué)的杰出研究成果之一,它把二項(xiàng)式系數(shù)圖形化,把組合數(shù)內(nèi)在的一些代數(shù)性質(zhì)直觀地從圖形中體現(xiàn)出來(lái),是一種離散型的數(shù)與形的結(jié)合。本文將介紹三種可以實(shí)現(xiàn)打印楊輝三角的辦法,感興趣的可以試一試
    2022-01-01
  • C++ 中使用lambda代替 unique_ptr 的Deleter的方法

    C++ 中使用lambda代替 unique_ptr 的Deleter的方法

    這篇文章主要介紹了C++ 中使用lambda代替 unique_ptr 的Deleter的方法,需要的朋友可以參考下
    2017-04-04
  • 一篇文章帶你了解論C語(yǔ)言中算法的重要性

    一篇文章帶你了解論C語(yǔ)言中算法的重要性

    最近一直在學(xué)數(shù)據(jù)結(jié)構(gòu)與算法,深深的感受到我們學(xué)習(xí)語(yǔ)言,永遠(yuǎn)都只是一項(xiàng)工具,方法才是其中最重要的部分。這篇文章我將會(huì)通過(guò)幾個(gè)例子來(lái)說(shuō)明算法,也就是寫程序的思路在程序中的重要意義
    2021-08-08
  • 使用C語(yǔ)言求二叉樹結(jié)點(diǎn)的最低公共祖先的方法

    使用C語(yǔ)言求二叉樹結(jié)點(diǎn)的最低公共祖先的方法

    這篇文章主要介紹了使用C語(yǔ)言求二叉樹結(jié)點(diǎn)的最低公共祖先的方法,文中還給出了ACM的練習(xí)題目,需要的朋友可以參考下
    2015-08-08
  • 插入排序算法之希爾排序+直接插入排序

    插入排序算法之希爾排序+直接插入排序

    這篇文章主要介紹了插入排序算法之希爾排序+直接插入排序的相關(guān)知識(shí),本文通過(guò)實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-11-11
  • 基于C++實(shí)現(xiàn)讀取指定路徑文件

    基于C++實(shí)現(xiàn)讀取指定路徑文件

    這篇文章主要介紹了基于C++實(shí)現(xiàn)讀取指定路徑文件,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • C++?ASIO實(shí)現(xiàn)異步套接字管理詳解

    C++?ASIO實(shí)現(xiàn)異步套接字管理詳解

    Boost?ASIO(Asynchronous?I/O)是一個(gè)用于異步I/O操作的C++庫(kù),該框架提供了一種方便的方式來(lái)處理網(wǎng)絡(luò)通信、多線程編程和異步操作,本文介紹了如何通過(guò)ASIO框架實(shí)現(xiàn)一個(gè)簡(jiǎn)單的異步網(wǎng)絡(luò)套接字應(yīng)用程序,需要的可以參考下
    2023-08-08
  • Eclipse中C++連接mysql數(shù)據(jù)庫(kù)

    Eclipse中C++連接mysql數(shù)據(jù)庫(kù)

    這篇文章主要為大家詳細(xì)介紹了Eclipse中C++連接mysql數(shù)據(jù)庫(kù) ,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • VsCode安裝和配置c/c++環(huán)境小白教程(圖文)

    VsCode安裝和配置c/c++環(huán)境小白教程(圖文)

    本文主要介紹了VsCode安裝和配置c/c++環(huán)境小白教程,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01

最新評(píng)論