Boost::any分析 - 边缘程序员的专栏 - CSDN博客

来源:百度文库 编辑:神马文学网 时间:2024/04/28 16:46:26
Boost::any分析收藏
 boost::any是一个能代表任何对象类型的对象,正如COM库的Variant变量类型,以及JAVA中的Object。不同的是,Variant的做法是包含所有可能类型的一个成员实现,浪费空间,而则boost::any借助于模板,没有空间浪费。Variant的大致实现是:Class Cvariant{       int   iData;         long lData;       ….       Int   type;}而boost::any则使用模板,依靠两个内部类来封装实际数据(PlaceFolder和Folder),并对外暴露一个叫做Type()的函数暴露实际数据的类型。为了方便分析其代码,现展示一个简单的测试代码:#include "stdafx.h"#include #include #include "boost/any.hpp" typedef std::list list_any;//关键部分:可以存放任意类型的对象void fill_list(list_any& la){   //存放常数   la.push_back(10   //存放字符串对象,   la.push_back( std::string("dyunze") );   //注意la.push_back(“dyunze”)错误,因为会被当错字符串数组}//根据类型进行显示:void show_list(list_any& la){       list_any::iterator it;       boost::any         anyone;       for( it = la.begin(); it != la.end(); it++ )       {              anyone = *it;              if( anyone.type() == typeid(int) )                     std::cout<(*it)<(*it).c_str()<        any(const ValueType & value): content(new holder(value))        {        }               //析构函数,删除保存数据的content对象        ~any()        {            delete content;        }        //一个placeholde对象指针,只想其子类folder的一个实现        // 即content( new holder(value) )语句        placeholder * content;    public:                //查询真实数据的类型,拆葙时有用。        const std::type_info & type() const        {            return content ? content->type() : typeid(void);        }        /**一个稻草人,存在好处是没有模板参数,可以直接申明,   *如:       placeholder * content;   *如果使用子类folder类,则这能用older   *content,而申明时Type还不确定*/        class placeholder        {        public:                 virtual ~placeholder()            {            }        public:             virtual const std::type_info & type() const = 0;            virtual placeholder * clone() const = 0;            };        //真正保存和获取数据的类。        template        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    ValueType * any_cast(any * operand)    {                                   return operand && operand->type() == typeid(ValueType) ?              &static_cast *>(operand->content)->held : 0;} 以上就是boost::any源代码的关键部分,其实很短小,但是,功能上非常强大,特别是在配合容器使用时。 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/chalichen/articles/365470.aspx
Boost::any分析 - 边缘程序员的专栏 - CSDN博客 游戏程序员养成计划 - Clayman的专栏 - CSDN博客 用Boost.Python构建混合系统 - 金庆的专栏 - CSDN博客 悲催的程序员,以及程序员的悲催 - 王卫Oneway的专栏 - CSDN博客 什么是SWOT分析法? - 心如止水--coofucoo的专栏 - CSDN博客 x264源代码分析. - duduhaha的专栏 - CSDN博客 H26L encoder.cfg参数分析 - cc1983的专栏 - CSDN博客 30岁以后程序员可以选择的三条路 - linux menuconfig的专栏 - CSDN博客 IT圈里的程序员们(1) - 荣植华的专栏 - CSDN博客 IT圈里的程序员们(2) - 荣植华的专栏 - CSDN博客 IT圈里的程序员们(3) - 荣植华的专栏 - CSDN博客 普通程序员如何走出困境? - 肖舸的专栏 - CSDN博客 我是怎么招聘程序员的 - 陈皓专栏 【空谷幽兰,心如皓月】 - CSDN博客 程序员,当你写程序写累了怎么办。 - 王福朋的专栏 - CSDN博客 baozhengw的专栏 - CSDN博客 话说程序员的职业生涯 - 《程序员》官方BLOG - CSDN博客 WMA文件信息格式分析及代码 - benny5609的专栏 - CSDN博客 Android图形架构实现分析总结 - shenbin1430的专栏 - CSDN博客 对国内几大视频网站http请求分析 - monkisgod的专栏 - CSDN博客 qvod与gvod原理分析与对比 - danscort2000的专栏 - CSDN博客 面向对象分析过程案例实战 - FcBayernMunchen的专栏 - CSDN博客 存储技术趋势预测与分析 - 刘爱贵的专栏 - CSDN博客 AGPS简介 - kv110的专栏 - CSDN博客 OpenMAX简介 - shenbin1430的专栏 - CSDN博客