" />

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

C++ Boost Variant示例超詳細講解

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

一、提要

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

        boost::variant 支持任何類型。例如,可以將 std::string 存儲在 boost::variant 變量中——這在 C++11 之前使用聯(lián)合是不可能的。在 C++11 中,對聯(lián)合的要求被放寬了?,F(xiàn)在聯(lián)合可以包含一個 std::string。因為 std::string 必須使用placement new 進行初始化,并且必須通過顯式調(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 中定義。因為 boost::variant 是一個模板,所以必須至少指定一個參數(shù)。一個或多個模板參數(shù)指定支持的類??型。在示例 24.1 中,v 可以存儲類型為 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 的存儲值,請使用獨立函數(shù) boost::get()(參見示例 24.2)。

        boost::get() 期望對應(yīng)變量的有效類型之一作為模板參數(shù)。指定無效類型將導致運行時錯誤,因為類型驗證不會在編譯時進行。

        boost::variant 類型的變量可以寫入標準輸出流等流,從而繞過運行時錯誤的風險(參見示例 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';
}

        對于類型安全的訪問,Boost.Variant 提供了一個名為 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);
}

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

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

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

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

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

        如果重載的運算符在功能上是等效的,則可以使用模板簡化代碼(參見示例 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);
}

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

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

相關(guān)文章

  • C++ sleep()和usleep()的區(qū)別

    C++ sleep()和usleep()的區(qū)別

    本文主要介紹了C++ sleep()和usleep()的區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-03-03
  • C語言制作簡易金山打字通功能的代碼

    C語言制作簡易金山打字通功能的代碼

    今天小編就為大家分享一篇關(guān)于C語言制作簡易金山打字通功能的代碼,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • C++ 內(nèi)存分區(qū)模型的使用(代碼區(qū)、全局區(qū)、棧區(qū)、堆區(qū)、new)

    C++ 內(nèi)存分區(qū)模型的使用(代碼區(qū)、全局區(qū)、棧區(qū)、堆區(qū)、new)

    這篇文章主要介紹了C++ 內(nèi)存分區(qū)模型的使用(代碼區(qū)、全局區(qū)、棧區(qū)、堆區(qū)、new),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • C++實現(xiàn)雙向冒泡排序算法

    C++實現(xiàn)雙向冒泡排序算法

    這篇文章主要為大家詳細介紹了C++實現(xiàn)雙向冒泡排序算法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • C++生成和解析XML文件的講解

    C++生成和解析XML文件的講解

    今天小編就為大家分享一篇關(guān)于C++生成和解析XML文件的講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • VC中SDK與MFC的區(qū)別淺析

    VC中SDK與MFC的區(qū)別淺析

    這篇文章主要介紹了VC中SDK與MFC的區(qū)別淺析,需要的朋友可以參考下
    2014-07-07
  • C語言線性表順序存儲結(jié)構(gòu)實例詳解

    C語言線性表順序存儲結(jié)構(gòu)實例詳解

    這篇文章主要介紹了C語言線性表順序存儲結(jié)構(gòu)實例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • C語言實現(xiàn)維吉尼亞密碼的示例代碼

    C語言實現(xiàn)維吉尼亞密碼的示例代碼

    維吉尼亞密碼(又譯維熱納爾密碼)是使用一系列凱撒密碼組成密碼字母表的加密算法,屬于多表密碼的一種簡單形式。本文將用C語言實現(xiàn)維吉尼亞密碼,需要的可以參考一下
    2022-11-11
  • QT編寫地圖實現(xiàn)在線輪廓圖的示例代碼

    QT編寫地圖實現(xiàn)在線輪廓圖的示例代碼

    輪廓圖也叫行政區(qū)劃,這里的輪廓圖是指百度地圖的區(qū)域輪廓圖。本文將為大家介紹QT如何實現(xiàn)在線輪廓圖的編寫,感興趣的小伙伴可以跟隨小編一起學習一下
    2021-12-12
  • 詳解C++中static的用法

    詳解C++中static的用法

    這篇文章主要介紹了c++中static的用法詳解,C 語言的 static 關(guān)鍵字有三種用途,具體內(nèi)容詳情大家跟隨腳本之家小編一起學習吧
    2018-05-05

最新評論

阜城县| 正宁县| 桐城市| 中山市| 甘肃省| 墨玉县| 临湘市| 平顺县| 子洲县| 塘沽区| 汽车| 金沙县| 响水县| 西乌珠穆沁旗| 德令哈市| 精河县| 札达县| 萨嘎县| 云安县| 阜新| 吉木乃县| 墨玉县| 滁州市| 宁波市| 封丘县| 福海县| 康平县| 孙吴县| 石狮市| 龙井市| 桦甸市| 图木舒克市| 成武县| 车险| 阿拉善左旗| 正定县| 沁水县| 建昌县| 高尔夫| 周至县| 屯昌县|