白喬原創 萬能型別boost any

2021-08-24 18:44:07 字數 2128 閱讀 5117

4.6 使用第三方庫

以上介紹了visual c++對物件賦值、轉換及字元編碼轉換的方法,實際上還有一些好用的第三方類庫用以輔助c++程式設計師完成物件處理,比較著名的就是boost。本節簡單介紹boost庫中與數值相關的boost::any、boost::lexical_cast,以及有理數類boost::rational。

4.6.1 萬能型別boost::any

boost庫提供了any類,boost::any是乙個能儲存任意型別值的類,這一點有點像variant型別,不過variant由於採用了乙個巨大的union,效率非常低。而boost利用模板,儲存的時候並不改變值的型別,只是在需要的時候才提供方法讓使用者進行型別判斷及取值。

boost::any幾乎可以用來儲存任何資料型別:

boost::anyai,as; 

ai=100;

as=string("hello"

);

需要的時候,我們又可以使用any_cast將原來的資料還原:

inti=boost::any_cast<int>(ai); 

strings=boost::any_cast(as);

當這種轉換發生型別不匹配時,會有異常bad_any_cast發生:

trycatch(boost::bad_any_cast&e)  

在傳統的c++程式中,為了支援各種資料型別,我們不得不使用萬能指標"void *",但是很遺憾的是,基於萬能指標的轉換是不安全的,"void*"缺少型別檢查。所以,我們建議大家盡量使用any類。

現在動手

編寫如下程式,體驗如何使用boost::any來完成物件型別轉換。

【程式 4-10】使用boost::any完成物件型別轉換

01#include"stdafx.h"

02#include"boost/any.hpp"

03#include

04 05using

namespacestd;

06using

namespaceboost;

07 08classcat

09;

11 12voidprint(anyit)

13 19

20if(it.type()==typeid(int))

21 25

26if(it.type()==typeid(string))

27 31

32if(it.type()==typeid(cstring))

33 37

38if(it.type()==typeid(cat))

39 43}

44 45intmain()

46;

50for(inti=0;i<sizeof(as)/sizeof(as[0]);i++)

51 54

55return0;56}

結果輸出如圖4-18所示。

該專案對應於光碟中的目錄"\ch04\boostanytest"。

以上摘自《把脈vc++》

第4.6.1小節的內容,如果你想與我交流,如下鏈結加我為好友:

白喬原創 萬能型別boost any

4.6 使用第三方庫 以上介紹了visual c 對物件賦值 轉換及字元編碼轉換的方法,實際上還有一些好用的第三方類庫用以輔助c 程式設計師完成物件處理,比較著名的就是boost。本節簡單介紹boost庫中與數值相關的boost any boost lexical cast,以及有理數類boost ...

萬能型別boost any

本節簡單介紹boost庫中與數值相關的boost any boost lexical cast,以及有理數類boost rational。boost庫提供了any類,boost any是乙個能儲存任意型別值的類,這一點有點像variant型別,不過variant由於採用了乙個巨大的union,效率非...

萬能資料型別any雜談

萬能資料型別boost any雜談 1 boost any 與 variant t 剛接觸boost any時,不禁讓人想起了 的 variant t類,因為兩者都可以存放其他的型別的值。比較一下兩者可以發現 variant t只能容納 variant 資料型別 詳見 而boost any可以容納用...