Posted on 2011-01-11 14:16
逐渐 阅读(688)
评论(0) 编辑 收藏 引用
boost any库可以在如下三方面改善你的程序:(1)任意类型的类型安全存储以及安全的取回;(2)在标准库容器中存放不同类型的方法;(3)可以在无须知道类型的情况下传送类型。
1 boost::any a; //定义any对象
2 a=std::string("boost any"); //any重载了模板赋值函数
3 a=3.1415;
4 a=15;
5
6 std::string s("any type");
7 boost::any b(s); //any的模板构造函数
8
从any对象中取出存放数据要借助普通模板函数any_cast,取回数据也很简单.
1 string ss=boost::any_cast<std::string>(b);
如果类型不符any_cast会抛出一个bad_any_cast异常,该异常继承自std::bad_cast.同时any对象有type()成员函数,可以比较类型后再进行类型转换.
1
2 if(a.type()==typeid(int))
3 {
4 int i=boost::any_cast<int>(a);
5 //do something
6 }
7 else if(a.type()==typeid(std::string))
8 {
9 std::string s=boost::any_cast<std::string>(a);
10 //do something
11 }
12 else
13 {
14 try
15 {
16 double d=boost::any_cast<double>(a);
17 //do something
18 }
19 catch(std::bad_cast& bc)
20 {
21 std::cout<<"Oops!";
22 //do something
23 }
24 }
25
说明:any类成员函数empty()用于判断对象中是否为空,在用any存放指针时要特别注意,any不保证指针非空,即存放空指针时empty()返回还是false.看如下代码片段便知:
1 int *p=0;
2 a=p;
3 if(!a.empty())
4 {
5 cout<<"a is not empty.\n";
6 }
7 else
8 {
9 cout<<"a is empty.\n";
10 }
11
输出结果为 a is not empty.所以我们要额外判断指针是否为空.
1 if(!a.empty())
2 {
3 if(boost::any_cast<int*>(a) != 0)
4 cout<<"a is not empty.\n";
5 else
6 cout<<"null pointer.\n";
7 }
8 else
9 {
10 cout<<"a is empty.\n";
11 }
12
any存放类指针支持多态.