boost數據結構any(很有用!)
阿新 • • 發佈:2017-07-11
namespace vertical vector 類型信息 exc except pty type_info vertica
如果希望一種數據結構具有tuple那樣的容納任意類型的能力,又可在運行時動態變化大小,可以用any作為元素類型搭配容器.
更多用法請參考boost程序完全開發指南... C++ Code
any是一種特殊的容器,它只能容納一個元素,但這個元素可以是任意類型;
可以用any保存任何類型,在任何需要的時候取出它;
這種功能和shared_ptr<void>類似,但是any是類型安全的;
any不是一個模板類,但是其有模板構造函數,從而實現任意類型;
空的any構造函數創建一個空的any對象,不持有任何值;
成員函數empty()可判斷any是否為空;
成員函數swap(...)可交換兩個any的值;
如果any持有一個對象,函數type()返回對象的type_info類型信息;
當容器的元素是any時,容器就像是一個可持有多個不同類型對象的動態tuple;
如果希望一種數據結構具有tuple那樣的容納任意類型的能力,又可在運行時動態變化大小,可以用any作為元素類型搭配容器.
更多用法請參考boost程序完全開發指南... C++ Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
/* boost_any.cpp any是一種特殊的容器,它只能容納一個元素,但這個元素可以是任意類型; 可以用any保存任何類型,在任何需要的時候取出它; 這種功能和shared_ptr<void>類似,但是any是類型安全的; any不是一個模板類,但是其有模板構造函數,從而實現任意類型; 空的any構造函數創建一個空的any對象,不持有任何值; 成員函數empty()可判斷any是否為空; 成員函數swap(...)可交換兩個any的值; 如果any持有一個對象,函數type()返回對象的type_info類型信息; 當容器的元素是any時,容器就像是一個可持有多個不同類型對象的動態tuple; 如果希望一種數據結構具有tuple那樣的容納任意類型的能力,又可在運行時動態變化大小,可以用any作為元素類型搭配容器. 更多用法請參考boost程序完全開發指南... */ /* class any { public: // construct/copy/destruct any(); any(const any &); template<typename ValueType> any(const ValueType &); any & operator=(const any &); template<typename ValueType> any & operator=(const ValueType &); ~any(); // modifiers any & swap(any &); // queries bool empty() const; const std::type_info & type() const; }; */ #include <iostream> #include <string> #include <vector> #include <cassert> #include <boost/any.hpp> #include <boost/typeof/typeof.hpp> #include <boost/assert.hpp> #include <boost/assign.hpp> using namespace std; using namespace boost; using namespace boost::assign; //輔助函數 template<typename T> bool can_cast(any& a) { return typeid(T) == a.type(); } template<typename T> T& get(any& an) { BOOST_ASSERT(can_cast<T>(an)); return *any_cast<T>(&an); } template<typename T> T* get_ptr(any& aaa) { BOOST_ASSERT(can_cast<T>(aaa)); return any_cast<T>(&aaa); } int main(void) { any a1(10); int nInt = any_cast<int>(a1); assert(nInt == 10); any_cast<int&>(a1) = 20; assert(any_cast<int>(a1) == 20); any a2 = 100; a1.swap(a2); any aaaaa("str"); a1.swap(aaaaa); try { any aa; if (aa.empty()) { cout << "empty" << endl; } int n = any_cast<int>(aa); } catch(boost::exception&) { cout << "exception" << endl; } get<int>(a1) = 10; *get_ptr<int>(a1) = 20; //應用於容器 vector<any> v1; v1.push_back(23); v1.push_back(3.145); v1.push_back("Michael Joessy"); vector<any> v2 = list_of<any>(10)(6.18)("string"); cin.get(); return 0; } |
boost數據結構any(很有用!)