这里我不打算讲boost::any的应用,具体的应用大家可以google即可。我想讲的是boost::any在设计上的技巧,这跟设计模式相关。
boost::any类并不是一个模板类,这可以大大的方便上层应用的使用,它会自动化的类型转换。核心就是any类中,包含一个模板类holder的基类placeholder指针,而placeholder却不是模板类,这样就可以被any类使用了。
具体的如下面所示:
- class any
- {
- public :
- //模板构造函数,参数可以是任意类型,真正的数据保存在content中
- template < typename ValueType>
- any(const ValueType & value): content( new holder<ValueType>(value))
- {
- }
- //析构函数,删除保存数据的content对象
- ~any()
- {
- delete content;
- }
- //一个placeholde对象指针,只想其子类folder的一个实现
- // 即content( new holder<ValueType>(value) )语句
- placeholder * content;
- public :
-
- //查询真实数据的类型,拆葙时有用。
- const std::type_info & type() const
- {
- return content ? content->type() : typeid ( void );
- }
- /**一个稻草人,存在好处是没有模板参数,可以直接申明,
- *如: placeholder * content;
- *如果使用子类folder类,则这能用older<Type>
- *content,而申明时Type还不确定
- */
- class placeholder
- {
- public :
- virtual ~placeholder()
- {
- }
- public :
- virtual const std::type_info & type() const = 0;
- virtual placeholder * clone() const = 0;
- };
- //真正保存和获取数据的类。
- template < typename ValueType>
- class holder : public placeholder
- {
- public :
- holder(const ValueType & value)
- : held(value)
- {
- }
- public :
- virtual const std::type_info & type() const
- {
- return typeid (ValueType);
- }
-
- virtual placeholder * clone() const
- {
- return new holder(held);
- }
-
- public :
- //真正的数据,就保存在这里
- ValueType held;
- };
- };
- /**
- *获取content->helder数据的方法。
- *
- */
- template < typename ValueType>
- ValueType * any_cast(any * operand)
- {
- return operand && operand->type() == typeid (ValueType) ? & static_cast <any::holder<ValueType> *>(operand->content)->held : 0;
- }
以后想设计一种上层应用不需要模板参数传递,而其功能却是要囊括通用类型(也即是需要模板参数泛化)的时候,可以不妨考虑一下这种设计方法