Chinaunix首页 | 论坛 | 博客
  • 博客访问: 19474
  • 博文数量: 4
  • 博客积分: 105
  • 博客等级: 民兵
  • 技术积分: 40
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-09 21:15
文章分类

全部博文(4)

文章存档

2013年(1)

2012年(3)

我的朋友
最近访客

分类: C/C++

2012-12-17 11:22:16

boost::any的设计理念是做成一个通用类型存储器。基于这个理念,上层应用就不需要关心容器里面所存储的数据类型是什么了。

这里我不打算讲boost::any的应用,具体的应用大家可以google即可。我想讲的是boost::any在设计上的技巧,这跟设计模式相关。

boost::any类并不是一个模板类,这可以大大的方便上层应用的使用,它会自动化的类型转换。核心就是any类中,包含一个模板类holder的基类placeholder指针,而placeholder却不是模板类,这样就可以被any类使用了。

具体的如下面所示:

点击(此处)折叠或打开

  1. class any
  2. {
  3. public :
  4.     //模板构造函数,参数可以是任意类型,真正的数据保存在content中
  5.     template < typename ValueType>
  6.         any(const ValueType & value): content( new holder<ValueType>(value))
  7.     {
  8.     }
  9.     //析构函数,删除保存数据的content对象
  10.     ~any()
  11.     {
  12.         delete content;
  13.     }
  14.     //一个placeholde对象指针,只想其子类folder的一个实现
  15.     // 即content( new holder<ValueType>(value) )语句
  16.     placeholder * content;
  17. public :
  18.  
  19.     //查询真实数据的类型,拆葙时有用。
  20.     const std::type_info & type() const
  21.     {
  22.         return content ? content->type() : typeid ( void );
  23.     }
  24.     /**一个稻草人,存在好处是没有模板参数,可以直接申明,
  25.      *如: placeholder * content;
  26.      *如果使用子类folder类,则这能用older<Type>
  27.      *content,而申明时Type还不确定
  28.      */
  29.     class placeholder
  30.     {
  31.     public :
  32.         virtual ~placeholder()
  33.         {
  34.         }
  35.     public :
  36.         virtual const std::type_info & type() const = 0;
  37.         virtual placeholder * clone() const = 0;
  38.     };
  39.     //真正保存和获取数据的类。
  40.     template < typename ValueType>
  41.         class holder : public placeholder
  42.     {
  43.     public :
  44.         holder(const ValueType & value)
  45.             : held(value)
  46.         {
  47.         }
  48.     public :
  49.         virtual const std::type_info & type() const
  50.         {
  51.             return typeid (ValueType);
  52.         }
  53.  
  54.         virtual placeholder * clone() const
  55.         {
  56.             return new holder(held);
  57.         }
  58.  
  59.     public :
  60.         //真正的数据,就保存在这里
  61.         ValueType held;
  62.     };
  63. };
  64. /**
  65.  *获取content->helder数据的方法。
  66.  *
  67.  */
  68.     template < typename ValueType>
  69. ValueType * any_cast(any * operand)
  70. {
  71.     return operand && operand->type() == typeid (ValueType) ? & static_cast <any::holder<ValueType> *>(operand->content)->held : 0;
  72. }

以后想设计一种上层应用不需要模板参数传递,而其功能却是要囊括通用类型(也即是需要模板参数泛化)的时候,可以不妨考虑一下这种设计方法

阅读(2870) | 评论(0) | 转发(0) |
0

上一篇:Boost Any与Variant

下一篇:没有了

给主人留下些什么吧!~~