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可以容納用...