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

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

 更新時間:2016年10月27日 09:33:08   投稿:daisy  
variant類型在C++14并沒有加入,若想在不支持C++17的編譯器上使用variant類型,我們可以通過boost的variant類型,variant類型可以表示任意一種類型和any類型有些相似,但還是有些區(qū)別下面將淺談variant的幾種訪問方法,感興趣的朋友們下面來一起看看吧。

Boost.Variant

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

Variant 庫如何改進你的程序?

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

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

     •變量訪問的編譯期檢查

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

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

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

使用boost::get

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

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

使用RTTI

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

使用訪問者模式

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里面增加一個函數(shù),但比使用RTTI里面的修改if-else結構好得多,因為使用訪問者模式至少是遵循開放-封閉原則的,即對寫開放,對修改封閉。

使用模板函數(shù)

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()改成了模板函數(shù)的好處就是不用關心variant支持多少類型。

總結

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

相關文章

  • C++11新特性之auto的使用

    C++11新特性之auto的使用

    熟悉腳本語言的人都知道,很多腳本語言都引入了“類型自動推斷”技術:比如Python,可以直接聲明變量,在運行時進行類型檢查。隨著C++11標準的發(fā)布,C++語言也引入了類型自動推斷的功能。這篇文章主要介紹了C++11新特性之auto的使用,有需要的朋友們可以參考借鑒。
    2016-12-12
  • C++入門之模板基礎講解

    C++入門之模板基礎講解

    這篇文章主要為大家介紹了C++入門之模板基礎,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-11-11
  • C++ 中時間與時間戳的轉換實例詳解

    C++ 中時間與時間戳的轉換實例詳解

    這篇文章主要介紹了C++ 中時間與時間戳的轉換實例詳解的相關資料,需要的朋友可以參考下
    2017-06-06
  • C語言實現(xiàn)電影管理系統(tǒng)

    C語言實現(xiàn)電影管理系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)電影管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • 關于python調用c++動態(tài)庫dll時的參數(shù)傳遞問題

    關于python調用c++動態(tài)庫dll時的參數(shù)傳遞問題

    這篇文章主要介紹了python調用c++動態(tài)庫dll時的參數(shù)傳遞,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • Opencv 馬賽克和毛玻璃效果與圖片融合的實現(xiàn)

    Opencv 馬賽克和毛玻璃效果與圖片融合的實現(xiàn)

    這篇文章主要為大家詳細介紹了通過OpenCV實現(xiàn)馬賽克和毛玻璃濾鏡效果與圖片的融合,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • C++中的Primer拷貝、賦值與銷毀詳解

    C++中的Primer拷貝、賦值與銷毀詳解

    這篇文章主要介紹了C++中的Primer拷貝、賦值與銷毀方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • DEV C++自動補全文件頭的設置操作教程

    DEV C++自動補全文件頭的設置操作教程

    Dev-C++ 是一款輕量級的集成開發(fā)環(huán)境 (IDE),主要用于 C 和 C++ 的程序編寫,它提供了基本的功能來幫助開發(fā)者更高效地工作,其中包括文件頭的自動補全功能,本文就給大家介紹了DEV C++自動補全文件頭的設置操作教程,需要的朋友可以參考下
    2025-04-04
  • 引用numpy出錯詳解及解決方法

    引用numpy出錯詳解及解決方法

    這篇文章主要介紹了引用numpy出錯 解決方法的相關資料,需要的朋友可以參考下
    2017-02-02
  • operator new在C++中的各種寫法總結

    operator new在C++中的各種寫法總結

    這篇文章并不是一個綜合的手冊,而是一個C++中各種內存分配方法的概述。它面向已經(jīng)很熟悉C++語言的讀者
    2013-09-09

最新評論

自治县| 龙海市| 乌鲁木齐市| 论坛| 房山区| 临安市| 安阳县| 团风县| 绥阳县| 泸溪县| 卫辉市| 武强县| 临夏县| 铜川市| 罗甸县| 册亨县| 建宁县| 嵊泗县| 内丘县| 都兰县| 苗栗县| 衡南县| 永定县| 南开区| 曲靖市| 许昌县| 丰县| 大港区| 谷城县| 额济纳旗| 民县| 阳城县| 靖远县| 新丰县| 洪泽县| 蕉岭县| 卓尼县| 徐州市| 遵义县| 孟村| 唐山市|