欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺析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ù)類型的類型轉(zhuǎn)換代碼的共同問題。

Variant 庫如何改進你的程序?

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

     •在標(biāo)準(zhǔn)庫容器中存儲不同類型的方法

     •變量訪問的編譯期檢查

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

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

下面將淺談variant的幾種訪問方法,一起來學(xué)習(xí)學(xué)習(xí)吧。

使用boost::get

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

使用boost::get來訪問,需要給出原始類型,并且這樣做不安全,若類型錯誤,程序?qū)伋霎惓!?/p>

使用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技術(shù)可以避免類型訪問錯誤而程序異常的情況,但是這樣做有點不優(yōu)雅,每增加一個類型,都需要修改if-else結(jié)構(gòu),并且使用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結(jié)構(gòu)好得多,因為使用訪問者模式至少是遵循開放-封閉原則的,即對寫開放,對修改封閉。

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

總結(jié)

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

相關(guān)文章

  • C++如何在變量前面加#

    C++如何在變量前面加#

    這篇文章主要介紹了C++如何在變量前面加#問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • C語言 詳解字符串基礎(chǔ)

    C語言 詳解字符串基礎(chǔ)

    在 C 語言中,字符串實際上是使用空字符 \0 結(jié)尾的一維字符數(shù)組。因此,\0 是用于標(biāo)記字符串的結(jié)束??兆址∟ull character)又稱結(jié)束符,縮寫 NUL,是一個數(shù)值為 0 的控制字符,\0 是轉(zhuǎn)義字符,意思是告訴編譯器,這不是字符 0,而是空字符
    2022-04-04
  • C語言通訊錄管理系統(tǒng)課程設(shè)計

    C語言通訊錄管理系統(tǒng)課程設(shè)計

    這篇文章主要為大家詳細介紹了C語言通訊錄管理系統(tǒng)課程設(shè)計,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • C語言實現(xiàn)套接字操作的示例代碼

    C語言實現(xiàn)套接字操作的示例代碼

    在C語言中,套接字(Socket)是一種進行網(wǎng)絡(luò)通信的接口,這篇文章就來和大家介紹一下C語言中是如何進行套接字操作的,需要的可以參考一下
    2023-06-06
  • 淺析C++?atomic?和?memory?ordering

    淺析C++?atomic?和?memory?ordering

    這篇文章主要介紹了C++?atomic?和?memory?ordering的相關(guān)知識,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • 從C++單例模式到線程安全詳解

    從C++單例模式到線程安全詳解

    下面小編就為大家?guī)硪黄獜腃++單例模式到線程安全詳解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12
  • C語言實現(xiàn)520表白代碼 祝你表白成功!

    C語言實現(xiàn)520表白代碼 祝你表白成功!

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)520表白代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • C語言深入探究斐波那契數(shù)列

    C語言深入探究斐波那契數(shù)列

    斐波那契數(shù)一般指斐波那契數(shù)列。 斐波那契數(shù)列(Fibonacci sequence),又稱黃金分割數(shù)列,因數(shù)學(xué)家萊昂納多·斐波那契(Leonardo Fibonacci)以兔子繁殖為例子而引入,故又稱為兔子數(shù)列
    2022-05-05
  • C語言利用面試真題理解指針的使用

    C語言利用面試真題理解指針的使用

    C語言這門課程在計算機的基礎(chǔ)教學(xué)中一直占有比較重要的地位,然而要想突破C語言的學(xué)習(xí),對指針的掌握是非常重要的,本文將具體針對指針的基礎(chǔ)做詳盡的介紹
    2022-08-08
  • linux下實現(xiàn)的2048游戲示例分享

    linux下實現(xiàn)的2048游戲示例分享

    這篇文章主要介紹了linux下實現(xiàn)的2048游戲示例,需要的朋友可以參考下
    2014-04-04

最新評論