boost数据结构any(很有用!)

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;

}

时间: 2024-10-25 13:45:21

boost数据结构any(很有用!)的相关文章

boost数据结构tuple

boost数据结构tuple tuple(元组)定义了一个有固定数目元素的容器,其中每个元素类型可以不相同,这与其它容器有着本质的区别!vector和array虽然可以容纳很多元素,但是元素的类型必须一致;tuple很有用,它是pair的泛化,可以从函数返回任意数量的值,也可以代替struct组合数据;boost.tuple使用库的方式为C++增加了这种很有用的数据结构,已被纳入C++ 11 TR1标准草案. 标准库中的pair是tuple的特例,即2-tuple(仅能持有两个成员的元组);tu

对于Linux系统管理员很有用的16个在线工具

1. ExplainShell.com 命令解释 ??对于Linux用户来说每天都会写各种命令和脚本,那么你可以使用这个网站工具来查看命令式如何工作的,这样可以避免不必要的错误出现:也是一个很好的学习命令的方式 2. BashrcGenerator.com 定制个性命令提示符 ??简单说就是个性化生成命令提示符,可将生成的代码写入到用户家目录的.bashrc或者可以设置全局变量文件/etc/profile对所有用户生效 ??可参考:http://stackoverflow.com/questio

Web 开发中 20 个很有用的 CSS 库

转自:http://www.oschina.net/translate/css-libraries-for-developers 在过去的几年中,CSS已经成为一大部分开发者和设计者的最爱,因为它提供了一系列功能和特性.每个月都有无数个围绕CSS的工具被开发者发布以简化WEB开发.像CSS 库,框架,应用这样的工具能够为开发者做很多事,而且可以使开发者创造出创新立异的WEB应用. 在这篇文件章中我们找到了一系列对开发者有用的CSS库,它们能帮助开发者在一定的期限内取得有创造性和创新性的成果.我们

19个很有用的 JavaScript库推荐

流行的 JavaScript 库有jQuery,MooTools,Prototype,Dojo和YUI等,这些 JavaScript 库功能丰富,加上它们众多的插件,几乎能实现任何你需要的功能 然而需要实现一些特定的功能,则可以选择功能更专一的轻量库,今天这篇文章与大家分享16个很有用的 JavaScript 库. Blackbird: Open Source JavaScript Logging UtilityBlackbird 是一款非常酷的 JavaScript 调试工具,带有一个漂亮的界

java android布局里的控件值 反射绑定给实体类,实体类绑定给控件,表单提交绑定很有用

注意了:根据实际情况,添加实体里字段的类型,控件类型的判断才可使用.这里控件只有TextView EditText 实体类字段只有String int类型,带值的控件添加tag ,值和实体类的字段值一致 package ice.ui.service; import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import jav

Unix / 类 Unix shell 中有哪些很酷很冷门很少用很有用的命令?(转)

著作权归作者所有. 商业转载请联系作者获得授权,非商业转载请注明出处. 作者:孙立伟 链接:http://www.zhihu.com/question/20140085/answer/14107336 来源:知乎 这个问题quora上有人提过 What are some lesser known but useful Unix commands? ,已经有不少答案了,我个人已经从这些答案中学到不少,这里我只是照搬过来,然后加上自己的解释. lsof: 列出所有打开的文件.举例:'lsof -p

20+个很有用的 jQuery 的 Google 地图插件

Google 地图在寻找我们想要了解的商店或者其它有趣的地方这种用途方面很流行和实用. 地图被一些商店特地集成到了它们的网站上面,这样就可以让人们容易找到它们的所在. 尽管其并不容易被集成,Google 地图使用起来还是简单且引人注目的. 在你的站点上集成它需要一个漫长且复杂的过程. 但多亏了拥有一个许多实用Google地图插件资源库的jQuery. 你只需要将jQeury地图插件安装到你的站点上,然后就可以开始根据你的业务需要来设计简单但能吸引人的地图了. 在本文中,我会列出一堆实用的jQue

[转载]对于Linux系统管理员很有用的16个在线工具

对于Linux系统管理员很有用的16个在线工具 08/15. 2014 1. ExplainShell.com 命令解释 对于Linux用户来说每天都会写各种命令和脚本,那么你可以使用这个网站工具来查看命令式如何工作的,这样可以避免不必要的错误出现:也是一个很好的学习命令的方式 2. BashrcGenerator.com 定制个性命令提示符 简单说就是个性化生成命令提示符,可将生成的代码写入到用户家目录的.bashrc或者可以设置全局变量文件/etc/profile对所有用户生效 可参考:ht

Linux系统一些不大常用却很有用的命令

which命令 用于查找并显示给定命令的绝对路径,环境变量PATH中保存了查找命令时需要遍历的目录.which命令会在环境变量PATH设置的目录里查找符合条件的文件.也就是说,使用which命令,就可以看到某个系统命令是否存在,以及执行的到底是哪一个位置的命令. whereis命令 用来定位命令的二进制程序.源代码文件和man手册页等相关文件的路径. locate/slocate命令 用来查找文件或目录. type命令 用来显示指定命令的类型,判断给出的命令是内部命令还是外部命令. getcon