" />

亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++ Boost Variant示例超詳細(xì)講解

 更新時(shí)間:2022年11月09日 09:01:02   作者:無水先生  
Boost是為C++語言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱。Boost庫(kù)是一個(gè)可移植、提供源代碼的C++庫(kù),作為標(biāo)準(zhǔn)庫(kù)的后備,是C++標(biāo)準(zhǔn)化進(jìn)程的開發(fā)引擎之一,是為C++語言標(biāo)準(zhǔn)庫(kù)提供擴(kuò)展的一些C++程序庫(kù)的總稱

一、提要

        Boost.Variant 提供了一個(gè)類似于 union 的名為 boost::variant 的類。您可以將不同類型的值存儲(chǔ)在 boost::variant 變量中。在任何時(shí)候只能存儲(chǔ)一個(gè)值。分配新值時(shí),舊值將被覆蓋。但是,新值的類型可能與舊值不同。唯一的要求是這些類型必須作為模板參數(shù)傳遞給 boost::variant,這樣它們才能為 boost::variant 變量所知。

        boost::variant 支持任何類型。例如,可以將 std::string 存儲(chǔ)在 boost::variant 變量中——這在 C++11 之前使用聯(lián)合是不可能的。在 C++11 中,對(duì)聯(lián)合的要求被放寬了?,F(xiàn)在聯(lián)合可以包含一個(gè) std::string。因?yàn)?std::string 必須使用placement new 進(jìn)行初始化,并且必須通過顯式調(diào)用析構(gòu)函數(shù)來銷毀,所以使用 boost::variant 仍然有意義,即使在 C++11 開發(fā)環(huán)境中也是如此。

二、示例

        示例 24.1。使用 boost::variant

#include <boost/variant.hpp>
#include <string>
int main()
{
  boost::variant<double, char, std::string> v;
  v = 3.14;
  v = 'A';
  v = "Boost";
}

        boost::variant 在 boost/variant.hpp 中定義。因?yàn)?boost::variant 是一個(gè)模板,所以必須至少指定一個(gè)參數(shù)。一個(gè)或多個(gè)模板參數(shù)指定支持的類??型。在示例 24.1 中,v 可以存儲(chǔ)類型為 double、char 或 std::string 的值。但是,如果您嘗試將 int 類型的值分配給 v,則生成的代碼將無法編譯。

        示例 24.2。使用 boost::get() 訪問 boost::variant 中的值

#include <boost/variant.hpp>
#include <string>
#include <iostream>
int main()
{
  boost::variant<double, char, std::string> v;
  v = 3.14;
  std::cout << boost::get<double>(v) << '\n';
  v = 'A';
  std::cout << boost::get<char>(v) << '\n';
  v = "Boost";
  std::cout << boost::get<std::string>(v) << '\n';
}

        要顯示 v 的存儲(chǔ)值,請(qǐng)使用獨(dú)立函數(shù) boost::get()(參見示例 24.2)。

        boost::get() 期望對(duì)應(yīng)變量的有效類型之一作為模板參數(shù)。指定無效類型將導(dǎo)致運(yùn)行時(shí)錯(cuò)誤,因?yàn)轭愋万?yàn)證不會(huì)在編譯時(shí)進(jìn)行。

        boost::variant 類型的變量可以寫入標(biāo)準(zhǔn)輸出流等流,從而繞過運(yùn)行時(shí)錯(cuò)誤的風(fēng)險(xiǎn)(參見示例 24.3)。

        示例 24.3。在流上直接輸出 boost::variant

#include <boost/variant.hpp>
#include <string>
#include <iostream>
int main()
{
  boost::variant<double, char, std::string> v;
  v = 3.14;
  std::cout << v << '\n';
  v = 'A';
  std::cout << v << '\n';
  v = "Boost";
  std::cout << v << '\n';
}

        對(duì)于類型安全的訪問,Boost.Variant 提供了一個(gè)名為 boost::apply_visitor() 的函數(shù)。

        示例 24.4。使用訪問者來提升::variant

#include <boost/variant.hpp>
#include <string>
#include <iostream>
struct output : public boost::static_visitor<>
{
  void operator()(double d) const { std::cout << d << '\n'; }
  void operator()(char c) const { std::cout << c << '\n'; }
  void operator()(std::string s) const { std::cout << s << '\n'; }
};
int main()
{
  boost::variant<double, char, std::string> v;
  v = 3.14;
  boost::apply_visitor(output{}, v);
  v = 'A';
  boost::apply_visitor(output{}, v);
  v = "Boost";
  boost::apply_visitor(output{}, v);
}

        作為其第一個(gè)參數(shù),boost::apply_visitor() 期望從 boost::static_visitor 派生的類的對(duì)象。此類必須為它所作用的 boost::variant 變量使用的每種類型重載 operator()。因此,在示例 24.4 中,運(yùn)算符重載了 3 次,因?yàn)?v 支持 double、char 和 std::string 類型。

        boost::static_visitor 是一個(gè)模板。 operator() 的返回值類型必須指定為模板參數(shù)。如果運(yùn)算符沒有返回值,則不需要模板參數(shù),如示例中所示。

        傳遞給 boost::apply_visitor() 的第二個(gè)參數(shù)是一個(gè) boost::variant 變量。

        boost::apply_visitor() 自動(dòng)為第一個(gè)參數(shù)調(diào)用 operator() ,該參數(shù)與當(dāng)前存儲(chǔ)在第二個(gè)參數(shù)中的值的類型相匹配。這意味著每次調(diào)用 boost::apply_visitor() 時(shí),示例程序都會(huì)使用不同的重載運(yùn)算符——首先是用于 double 的運(yùn)算符,然后是用于 char 的運(yùn)算符,最后是用于 std::string 的運(yùn)算符。

        boost::apply_visitor() 的優(yōu)點(diǎn)不僅在于自動(dòng)調(diào)用正確的運(yùn)算符。此外,boost::apply_visitor() 確保為 boost::variant 變量支持的每種類型都提供了重載運(yùn)算符。如果未定義三個(gè)重載運(yùn)算符之一,則無法編譯代碼。

        如果重載的運(yùn)算符在功能上是等效的,則可以使用模板簡(jiǎn)化代碼(參見示例 24.5)。

        示例 24.5。使用帶有 boost::variant 函數(shù)模板的訪問者

#include <boost/variant.hpp>
#include <string>
#include <iostream>
struct output : public boost::static_visitor<>
{
  template <typename T>
  void operator()(T t) const { std::cout << t << '\n'; }
};
int main()
{
  boost::variant<double, char, std::string> v;
  v = 3.14;
  boost::apply_visitor(output{}, v);
  v = 'A';
  boost::apply_visitor(output{}, v);
  v = "Boost";
  boost::apply_visitor(output{}, v);
}

        因?yàn)?boost::apply_visitor() 確保了編譯時(shí)代碼的正確性,所以應(yīng)該優(yōu)先于 boost::get()。

到此這篇關(guān)于C++ Boost Variant示例超詳細(xì)講解的文章就介紹到這了,更多相關(guān)C++ Boost Variant內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 一文帶你掌握C++中的移動(dòng)語義和完美轉(zhuǎn)發(fā)

    一文帶你掌握C++中的移動(dòng)語義和完美轉(zhuǎn)發(fā)

    這篇文章主要為大家詳細(xì)介紹了C++中的移動(dòng)語義和完美轉(zhuǎn)發(fā)的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),對(duì)我們深入掌握C++有一定的幫助,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-12-12
  • C語言超詳細(xì)講解數(shù)據(jù)結(jié)構(gòu)中雙向帶頭循環(huán)鏈表

    C語言超詳細(xì)講解數(shù)據(jù)結(jié)構(gòu)中雙向帶頭循環(huán)鏈表

    帶頭雙向循環(huán)鏈表:結(jié)構(gòu)最復(fù)雜,一般用在單獨(dú)存儲(chǔ)數(shù)據(jù)。實(shí)際中使用的鏈表數(shù)據(jù)結(jié)構(gòu),都是帶頭雙向循環(huán)鏈表。另外這個(gè)結(jié)構(gòu)雖然結(jié)構(gòu)復(fù)雜,但是使用代碼實(shí)現(xiàn)以后會(huì)發(fā)現(xiàn)結(jié)構(gòu)會(huì)帶來很多優(yōu)勢(shì),實(shí)現(xiàn)反而簡(jiǎn)單
    2022-04-04
  • 淺談C++中replace()方法

    淺談C++中replace()方法

    C++編程語言中的string應(yīng)用方式多樣化,每一種應(yīng)用方式都能幫助我們提實(shí)現(xiàn)特定的功能需求。在這里我們將會(huì)為大家詳細(xì)介紹一下其中一個(gè)比較重要的用法,有關(guān)C++ replace()函數(shù)的應(yīng)用方式,需要的朋友可以參考下
    2015-11-11
  • C++使用TinyXML2實(shí)現(xiàn)解析和生成XML數(shù)據(jù)

    C++使用TinyXML2實(shí)現(xiàn)解析和生成XML數(shù)據(jù)

    TinyXML2是一個(gè)輕量級(jí)的、開源的C++庫(kù),專門用于解析和生成XML文檔,本文主要為大家介紹了如何使用TinyXML2實(shí)現(xiàn)解析和生成XML數(shù)據(jù),需要的可以參考下
    2024-04-04
  • C++中g(shù)etline()和get()的方法淺析

    C++中g(shù)etline()和get()的方法淺析

    大家都知道作為C++獲取輸入流的方法,幾乎在任何一本資料書上getline()方法和get()方法都作為入門級(jí)的方法進(jìn)行講述,即便如此,筆者在學(xué)習(xí)C++的過程中仍經(jīng)常忘記這二者的使用要點(diǎn),可能也有C++的初學(xué)者對(duì)這兩個(gè)方法還心存疑慮,本篇文章就這兩個(gè)方法的使用進(jìn)行簡(jiǎn)要闡述。
    2016-10-10
  • Qt5.9畫五角星的方法

    Qt5.9畫五角星的方法

    這篇文章主要為大家詳細(xì)介紹了Qt5.9畫五角星的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • C語言之system函數(shù)案例詳解

    C語言之system函數(shù)案例詳解

    這篇文章主要介紹了C語言之system函數(shù)案例詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++中求數(shù)組長(zhǎng)度的方法詳解

    C++中求數(shù)組長(zhǎng)度的方法詳解

    C++中沒有直接提供求數(shù)組長(zhǎng)度的方法,提供了sizeof(),begin(),end()等方法,可以供求數(shù)組長(zhǎng)度使用,文中通過代碼示例給大家講解的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下
    2023-12-12
  • C++實(shí)現(xiàn)哈希桶的詳細(xì)教程

    C++實(shí)現(xiàn)哈希桶的詳細(xì)教程

    這篇文章主要介紹了C++實(shí)現(xiàn)哈希桶的詳細(xì)教程,哈希的底層是一個(gè)vector的數(shù)組,數(shù)組中的每個(gè)節(jié)點(diǎn)都有一個(gè)pair類型的數(shù)據(jù),文中通過代碼示例和圖文講解的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下
    2024-06-06
  • VC++ 使用 _access函數(shù)判斷文件或文件夾是否存在

    VC++ 使用 _access函數(shù)判斷文件或文件夾是否存在

    這篇文章主要介紹了VC++ 使用 _access函數(shù)判斷文件或文件夾是否存在的相關(guān)資料,需要的朋友可以參考下
    2015-10-10

最新評(píng)論