1. 程式人生 > >boost數據結構any(很有用!)

boost數據結構any(很有用!)

namespace vertical vector 類型信息 exc except pty type_info vertica

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(很有用!)