萬能型別boost any

2021-06-19 11:30:08 字數 2416 閱讀 5671

本節簡單介紹boost庫中與數值相關的boost::anyboost::lexical_cast,以及有理數類boost::rational

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

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

boost::any ai, as;  

ai = 100;  

as = string(

"hello"

); 

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

inti = boost::any_cast<

int

>(ai);  

string s = 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    

05  

using

namespace

std;  

06  

using

namespace

boost;  

07    

08  

class

cat  

09  ;  

11    

12  

void

print(any it)  

13    

19    

20      

if

(it.type() == 

typeid

(int

))  

21        

25    

26      

if

(it.type() == 

typeid

(string))  

27        

31    

32      

if

(it.type() == 

typeid

(cstring))  

33        

37    

38      

if

(it.type() == 

typeid

(cat))  

39        

43  }  

44    

45  

int

main()  

46  ;  

50      

for

(int

i = 0; i 

sizeof

(as) / 

sizeof

(as[0]); i++)  

51        

54    

55      

return

0;56 } 

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

白喬原創 萬能型別boost any

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

白喬原創 萬能型別boost any

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

萬能密碼 php,PHP萬能密碼

說實話如果乙個 的前台都是注入漏洞,那麼憑經驗,萬能密碼進後台的機率基本上是百分之百。可是有的人說對php的站如果是gpc魔術轉換開啟,就會對特殊符號轉義,就徹底杜絕了php注入。其實說這話的人沒有好好想過,更沒有嘗試過用萬能密碼進php的後台。其實gpc魔術轉換是否開啟對用萬能密碼進後台一點影響也...