zhujian

揣着梦想骑驴找马但不虐待驴
posts - 10, comments - 7, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

Boost any

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存放类指针支持多态.



只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理