一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - 淺析C++中boost.variant的幾種訪問方法

淺析C++中boost.variant的幾種訪問方法

2021-04-19 14:44daisy C/C++

variant類型在C++14并沒有加入,若想在不支持C++17的編譯器上使用variant類型,我們可以通過boost的variant類型,variant類型可以表示任意一種類型和any類型有些相似,但還是有些區別下面將淺談variant的幾種訪問方法,感興趣的朋友們下面

Boost.Variant

Variant庫包含一個不同于union的泛型類,用于在存儲和操作來自于不同類型的對象。這個庫的一個特點是支持類型安全的訪問,減少了不同數據類型的類型轉換代碼的共同問題。

Variant 庫如何改進你的程序?

     •對用戶指定的多種類型的進行類型安全的存儲和取回

     •在標準庫容器中存儲不同類型的方法

     •變量訪問的編譯期檢查

     •高效的、基于棧的變量存儲

Variant 庫關注的是對一組限定類型的類型安全存儲及取回,即非無類的聯合。Boost.Variant 庫與 Boost.Any 有許多共同之外,但在功能上也有不同的考慮。在每天的編程中通常都會需要用到非無類的聯合(不同的類型)。保持類型安全的一個典型方法是使用抽象基類,但這不總是可以做到的;即使可以做得,堆分配和虛擬函數的代價也可能太高。你也可以嘗試用不安全的無類類型,如 void* (它會導致不幸),或者是類型安全得無限制的可變類型,如 Boost.Any. 這里我們將看到 Boost.Variant,它支持限定的可變類型,即元素來自于一組支持的類型。

下面將淺談variant的幾種訪問方法,一起來學習學習吧。

使用boost::get

?
1
2
3
boost::variant<int, std::string> v;
v = "Hello world";
std::cout << boost::get<std::string>(v) << std::endl;

使用boost::get來訪問,需要給出原始類型,并且這樣做不安全,若類型錯誤,程序將會拋出異常。

使用RTTI

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void var_print(boost::variant<int, std::string>& v)
{
  if (v.type() == typeid(int))
  {
    std::cout << get<int>(v) << std::endl;
  }
  else if (v.type() == typeid(std::string))
  {
    std::cout << get<std::string>(v) << std::endl;
  }
  // Else do nothing
}
int main()
{
  boost::variant<int, std::string> v;
  v = "Hello world";
  var_print(v);
  return 0;
}

使用RTTI技術可以避免類型訪問錯誤而程序異常的情況,但是這樣做有點不優雅,每增加一個類型,都需要修改if-else結構,并且使用RTTI會對程序性能有一定影響。

使用訪問者模式

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class var_visitor : public boost::static_visitor<void>
{
public:
  void operator()(int& i) const
  {
    std::cout << i << std::endl;
  }
  void operator()(std::string& str) const
  {
    std::cout << str << std::endl;
  }
};
int main()
{
  boost::variant<int, std::string> v;
  v = "Hello world";
  boost::apply_visitor(var_visitor(), v);
  return 0;
}

使用該模式,需要定義一個類并繼承于boost::static_visitor,在類里面需要重載()操作符,通過boost::apply_visitor來訪問原始類型的值,這樣做還是有些繁瑣,每增加一個類型,都需要在var_visitor里面增加一個函數,但比使用RTTI里面的修改if-else結構好得多,因為使用訪問者模式至少是遵循開放-封閉原則的,即對寫開放,對修改封閉。

使用模板函數

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class var_visitor : public boost::static_visitor<void>
{
public:
  template<typename T>
  void operator()(T& i) const
  {
    std::cout << i << std::endl;
  }
};
int main()
{
  boost::variant<int, std::string> v;
  v = "Hello world";
  boost::apply_visitor(var_visitor(), v);
  return 0;
}

operator()改成了模板函數的好處就是不用關心variant支持多少類型。

總結

以上就是這篇文章的全部內容,希望本文的內容對大家學習或者使用C++能有所幫助,如果有疑問大家可以留言交流。謝謝大家對服務器之家的支持。

延伸 · 閱讀

精彩推薦
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
主站蜘蛛池模板: 久久内在线视频精品mp4 | 麻豆亚洲一区 | 欧亚精品一区二区三区 | 天天综合色天天综合网 | 精品国产品香蕉在线观看75 | 亚洲精品中文 | 男人午夜视频在线观看 | 欧美亚洲韩国 | 欧美日韩一区视频 | 欧美视频黑鬼大战白妞 | 日本一卡二卡3卡四卡无卡网址 | 999jjj在线播放| 午夜久久久久久网站 | 青青青久在线视频免费观看 | 日本高清中文字幕视频在线 | 九草在线视频 | 亚洲上最大成网人站4438 | 饭冈加奈子黑人解禁在线播放 | 色戒西瓜 | 好吊色视频988gao在线观看 | 成人国产精品一区二区不卡 | 91一区二区在线观看精品 | 高清不卡免费一区二区三区 | 精品国产乱码久久久久久软件 | 欧美艳星kagneyiynn高清 | 欧美精品一区二区三区久久 | 青青青草国产 | 欧美伊人久久久久久久久影院 | 国产小嫩模好紧 | 2020韩国r级理论片在线观看 | 国产chinese男同gay | 69成人网 | 成人性用品 | 国产青色| xxxxx大片在线观看 | 视频二区 素人 欧美 日韩 | 女bbbxxx毛片视频| 超鹏97国语 | 欧美一级在线播放 | 国产成人精品第一区二区 | 538亚洲欧美国产日韩在线精品 |