程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 白喬原創:萬能類型boost::any

白喬原創:萬能類型boost::any

編輯:關於C語言

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幾乎可以用來存儲任何數據類型:

  1. boost::any ai, as;  
  2. ai = 100;  
  3. as = string("hello"); 
需要的時候,我們又可以使用any_cast將原來的數據還原:
  1. int i = boost::any_cast<int>(ai);  
  2. string s = boost::any_cast<string>(as); 
當這種轉換發生類型不匹配時,會有異常bad_any_cast發生:
  1. try 
  2. {  
  3.     int i = boost::any_cast<int>(as);  
  4. }  
  5. catch(boost::bad_any_cast & e)  
  6. {  
在傳統的C++程序中,為了支持各種數據類型,我們不得不使用萬能指針"void *",但是很遺憾的是,基於萬能指針的轉換是不安全的,"void*"缺少類型檢查。所以,我們建議大家盡量使用any類。 現在動手 編寫如下程序,體驗如何使用boost::any來完成對象類型轉換。 程序 4-10】使用boost::any完成對象類型轉換
  1. 01  #include "stdafx.h" 
  2. 02  #include "boost/any.hpp" 
  3. 03  #include <string>  
  4. 04    
  5. 05  using namespace std;  
  6. 06  using namespace boost;  
  7. 07    
  8. 08  class Cat  
  9. 09  {  
  10. 10  };  
  11. 11    
  12. 12  void print(any it)  
  13. 13  {  
  14. 14      if(it.empty())  
  15. 15      {  
  16. 16          printf("nothing!\r\n");  
  17. 17          return;  
  18. 18      }  
  19. 19    
  20. 20      if(it.type() == typeid(int))  
  21. 21      {  
  22. 22          printf("integer: %d\r\n", any_cast<int>(it));  
  23. 23          return;  
  24. 24      }  
  25. 25    
  26. 26      if(it.type() == typeid(string))  
  27. 27      {  
  28. 28          printf("string: %s\r\n", any_cast<string>(it).c_str());  
  29. 29          return;  
  30. 30      }  
  31. 31    
  32. 32      if(it.type() == typeid(CString))  
  33. 33      {  
  34. 34          _tprintf(_T("CString: %s\r\n"), any_cast<CString>(it));  
  35. 35          return;  
  36. 36      }  
  37. 37    
  38. 38      if(it.type() == typeid(Cat))  
  39. 39      {  
  40. 40          _tprintf(_T("oops! a cat!\r\n"));  
  41. 41          return;  
  42. 42      }  
  43. 43  }  
  44. 44    
  45. 45  int main()  
  46. 46  {  
  47. 47      print(100);  
  48. 48    
  49. 49      any as[] = {any(), 100, string("hello"), CString("world"), Cat()};  
  50. 50      for(int i = 0; i < sizeof(as) / sizeof(as[0]); i++)  
  51. 51      {  
  52. 52          print(as[i]);  
  53. 53      }  
  54. 54    
  55. 55      return 0;56 } 
結果輸出如圖4-18所示。

=========================================== 以上摘自《把脈VC++》第4.6.1小節的內容

本文出自 “白喬博客” 博客,請務必保留此出處http://bluejoe.blog.51cto.com/807902/192762

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved