C++ Boost Optional示例超詳細(xì)講解
一、概述
數(shù)據(jù)結(jié)構(gòu)類似于容器,因?yàn)樗鼈兛梢源鎯?chǔ)一個(gè)或多個(gè)元素。但是,它們與容器不同,因?yàn)樗鼈儾恢С秩萜魍ǔVС值牟僮?。例如,使用本部分介紹的數(shù)據(jù)結(jié)構(gòu),不可能在一次迭代中訪問所有元素。
Boost.Optional 可以很容易地標(biāo)記可選的返回值。使用 Boost.Optional 創(chuàng)建的對(duì)象要么是空的,要么包含單個(gè)元素。使用 Boost.Optional,您無需使用空指針或 -1 等特殊值來指示函數(shù)可能沒有返回值。
- Boost.Tuple 提供了 boost::tuple,這是一個(gè)自 C++11 以來一直是標(biāo)準(zhǔn)庫的一部分的類。
- Boost.Any 和 Boost.Variant 允許您創(chuàng)建可以存儲(chǔ)不同類型值的變量。 Boost.Any 支持任意類型,Boost.Variant 允許您將需要支持的類型作為模板參數(shù)傳遞。
- Boost.PropertyTree 提供了一個(gè)樹狀的數(shù)據(jù)結(jié)構(gòu)。該庫通常用于幫助管理配置數(shù)據(jù)。數(shù)據(jù)還可以以 JSON 等格式寫入文件或從文件中加載。
- Boost.DynamicBitset 提供了一個(gè)類似于 std::bitset 但在運(yùn)行時(shí)配置的類。
- Boost.Tribool 提供了一種類似于 bool 的數(shù)據(jù)類型,支持三種狀態(tài)。
- Boost.CompressedPair 定義了 boost::compressed_pa??ir 類,可以替代 std::pair。該類支持所謂的空基類優(yōu)化。
二、Boost.Optional
庫 Boost.Optional 提供類 boost::optional,可用于可選返回值。這些是函數(shù)的返回值,可能并不總是返回結(jié)果。示例 21.1 說明了在沒有 Boost.Optional 的情況下通常如何實(shí)現(xiàn)可選返回值。
示例 21.1。表示可選返回值的特殊值
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cmath>
int get_even_random_number()
{
int i = std::rand();
return (i % 2 == 0) ? i : -1;
}
int main()
{
std::srand(static_cast<unsigned int>(std::time(0)));
int i = get_even_random_number();
if (i != -1)
std::cout << std::sqrt(static_cast<float>(i)) << '\n';
}示例 21.1 使用函數(shù) get_even_random_number(),它應(yīng)該返回一個(gè)偶數(shù)隨機(jī)數(shù)。它通過調(diào)用標(biāo)準(zhǔn)庫中的函數(shù) std::rand() 以一種相當(dāng)幼稚的方式做到這一點(diǎn)。如果 std::rand() 生成偶數(shù)隨機(jī)數(shù),則該數(shù)字由 get_even_random_number() 返回。如果生成的隨機(jī)數(shù)是奇數(shù),則返回-1。
在此示例中,-1 表示無法生成偶數(shù)隨機(jī)數(shù)。因此,get_even_random_number() 不能保證返回偶數(shù)隨機(jī)數(shù)。返回值是可選的。
許多函數(shù)使用 -1 之類的特殊值來表示不能返回任何結(jié)果。例如,如果找不到子字符串,std::string 類的成員函數(shù) find() 將返回特殊值 std::string::npos。返回值為指針的函數(shù)通常返回 0 表示不存在結(jié)果。
Boost.Optional 提供了 boost::optional,這使得可以清楚地標(biāo)記可選的返回值。
示例 21.2。帶有 boost::optional 的可選返回值
#include <boost/optional.hpp>
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cmath>
using boost::optional;
optional<int> get_even_random_number()
{
int i = std::rand();
return (i % 2 == 0) ? i : optional<int>{};
}
int main()
{
std::srand(static_cast<unsigned int>(std::time(0)));
optional<int> i = get_even_random_number();
if (i)
std::cout << std::sqrt(static_cast<float>(*i)) << '\n';
}在示例 21.2 中,get_even_random_number() 的返回值具有一個(gè)新類型,boost::optional<int>。 boost::optional 是一個(gè)模板,必須使用返回值的實(shí)際類型進(jìn)行實(shí)例化。 boost/optional.hpp 必須包含在 boost::optional 中。
如果 get_even_random_number() 生成偶數(shù)隨機(jī)數(shù),則直接返回該值,并自動(dòng)包裝在類型為 boost::optional<int> 的對(duì)象中,因?yàn)?boost::optional 提供了一個(gè)非排他的構(gòu)造函數(shù)。如果 get_even_random_number() 不生成偶數(shù)隨機(jī)數(shù),則返回 boost::optional<int> 類型的空對(duì)象。返回值是通過調(diào)用默認(rèn)構(gòu)造函數(shù)創(chuàng)建的。
main() 檢查 i 是否為空。如果它不為空,則使用 operator* 訪問存儲(chǔ)在 i 中的數(shù)字。 boost::optional 似乎像指針一樣工作。但是,您不應(yīng)將 boost::optional 視為指針,因?yàn)槔?,boost::optional 中的值由復(fù)制構(gòu)造函數(shù)復(fù)制,而指針不會(huì)復(fù)制其指向的值。
示例 21.3。 boost::optional 的其他有用的成員函數(shù)
#include <boost/optional.hpp>
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cmath>
using boost::optional;
optional<int> get_even_random_number()
{
int i = std::rand();
return optional<int>{i % 2 == 0, i};
}
int main()
{
std::srand(static_cast<unsigned int>(std::time(0)));
optional<int> i = get_even_random_number();
if (i.is_initialized())
std::cout << std::sqrt(static_cast<float>(i.get())) << '\n';
}示例 21.3 介紹了 boost::optional 的其他有用的成員函數(shù)。此類提供了一個(gè)特殊的構(gòu)造函數(shù),它將條件作為第一個(gè)參數(shù)。如果條件為真,則使用第二個(gè)參數(shù)初始化 boost::optional 類型的對(duì)象。如果條件為假,則會(huì)創(chuàng)建一個(gè) boost::optional 類型的空對(duì)象。示例 21.3 在函數(shù) get_even_random_number() 中使用此構(gòu)造函數(shù)。
使用 is_initialized() 您可以檢查 boost::optional 類型的對(duì)象是否不為空。 Boost.Optional 涉及已初始化和未初始化的對(duì)象——因此,成員函數(shù)的名稱為 is_initialized()。成員函數(shù) get() 等效于 operator*。
示例 21.4。 Boost.Optional 的各種輔助函數(shù)
#include <boost/optional.hpp>
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cmath>
using namespace boost;
optional<int> get_even_random_number()
{
int i = std::rand();
return make_optional(i % 2 == 0, i);
}
int main()
{
std::srand(static_cast<unsigned int>(std::time(0)));
optional<int> i = get_even_random_number();
double d = get_optional_value_or(i, 0);
std::cout << std::sqrt(d) << '\n';
}Boost.Optional 提供獨(dú)立的輔助函數(shù),例如 boost::make_optional() 和 boost::get_optional_value_or()(參見示例 21.4)??梢哉{(diào)用 boost::make_optional() 來創(chuàng)建 boost::optional 類型的對(duì)象。如果您希望在 boost::optional 為空時(shí)返回默認(rèn)值,您可以調(diào)用 boost::get_optional_value_or()。
函數(shù) boost::get_optional_value_or() 也作為 boost::optional 的成員函數(shù)提供。它被稱為 get_value_or()。
除了 boost/optional/optional_io.hpp 之外,Boost.Optional 還提供了一個(gè)帶有重載流運(yùn)算符的頭文件,讓您可以將 boost::optional 類型的對(duì)象寫入標(biāo)準(zhǔn)輸出等。
參考文:
Chapter21.Boost.Optional (theboostcpplibraries.com)
到此這篇關(guān)于C++ Boost Optional示例超詳細(xì)講解的文章就介紹到這了,更多相關(guān)C++ Boost Optional內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言實(shí)現(xiàn)銷售管理系統(tǒng)設(shè)計(jì)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)銷售管理系統(tǒng)設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
C語言詳解分析進(jìn)程控制中進(jìn)程終止的實(shí)現(xiàn)
當(dāng)進(jìn)程完成執(zhí)行最后語句并且通過系統(tǒng)調(diào)用 exit() 請(qǐng)求操作系統(tǒng)刪除自身時(shí),進(jìn)程終止。這時(shí),進(jìn)程可以返回狀態(tài)值(通常為整數(shù))到父進(jìn)程(通過系統(tǒng)調(diào)用 wait())。所有進(jìn)程資源,如物理和虛擬內(nèi)存、打開文件和 I/O 緩沖區(qū)等,會(huì)由操作系統(tǒng)釋放2022-08-08
C語言字符串函數(shù)介紹與模擬實(shí)現(xiàn)詳解
字符串函數(shù)(String?processing?function)也叫字符串處理函數(shù),指的是編程語言中用來進(jìn)行字符串處理的函數(shù),如C,pascal,Visual以及LotusScript中進(jìn)行字符串拷貝,計(jì)算長度,字符查找等的函數(shù)2022-02-02
Visual?Studio?2022下載安裝與使用超詳細(xì)教程
這篇文章主要介紹了Visual?Studio?2022最新版安裝與使用教程,本文以社區(qū)版為例通過圖文并茂的形式給大家介紹Visual?Studio?2022安裝使用,需要的朋友可以參考下2022-04-04
基于C語言代碼實(shí)現(xiàn)點(diǎn)餐系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了基于C語言代碼實(shí)現(xiàn)點(diǎn)餐系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-01-01
詳解C標(biāo)準(zhǔn)庫堆內(nèi)存函數(shù)
在C/C++語言中,我們知道內(nèi)存分為這幾種:程序全局變量內(nèi)存、棧內(nèi)存、堆內(nèi)存。其中堆內(nèi)存就是通過malloc(new)來分配的內(nèi)存,本文我們來探討一下C標(biāo)準(zhǔn)庫堆內(nèi)存函數(shù)。2021-06-06
C語言詳細(xì)講解strcpy strcat strcmp函數(shù)的模擬實(shí)現(xiàn)
這篇文章主要介紹了怎樣用C語言模擬實(shí)現(xiàn)strcpy與strcat和strcmp函數(shù),strcpy()函數(shù)是C語言中的一個(gè)復(fù)制字符串的庫函數(shù),strcat()函數(shù)的功能是實(shí)現(xiàn)字符串的拼接,strcmp()函數(shù)作用是比較字符串str1和str2是否相同2022-05-05
數(shù)據(jù)結(jié)構(gòu)之位圖(bitmap)詳解
這篇文章主要介紹了數(shù)據(jù)結(jié)構(gòu)之位圖詳解,本文講解了位圖的基本知識(shí)、位圖的實(shí)現(xiàn)方法、位圖的應(yīng)用等內(nèi)容,需要的朋友可以參考下2014-08-08

