| 首页 | 新闻 | 网页 | 设计 | 色彩 | 原创 | 视觉 | 素材 | 动漫 | 酷站 | 策划 | 文案 | 访谈 | 运营 | 编程 | 数据库 | 服务器 | 下载 | 图库 | 
您的位置: 幽幽天空 > 网页 > 编程开发 > Visual C++教程 > 文章正文 用户登录
网络营销之google
Google质疑艾瑞报
google使用技巧
Google Adsense改
王通:Google应该
Google真的那么容
Google 广告联盟
Google Adsense将
Google AdSense开
阿里联盟发布yaho

boost::any源代码分析           

boost::any源代码分析

作者:佚名 来源:不详 更新:2006-8-25 21:05:35 错误报告 我要投稿
分析:是一个能代表任何对象类型的对象,正如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 <iostream>

#include <list>

#include "boost/any.hpp"

typedef std::list<boost::any> 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<<boost::any_cast<int>(*it)<<std::endl;

              else if( anyone.type() == typeid(std::string) )

                     std::cout<<boost::any_cast<std::string>(*it).c_str()<<std::endl;

       }

}

//主程序部分:

int main(int argc, char* argv[])

{

       list_any la;

       fill_list(la);

      

       show_list(la);

       return 0;

}

以下是我整理了后的boost::any的关键代码,(只是为了说明,可能无法直接运行,如需要完整代码,请到www.boost.org下载boost库。)如下所示:

    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

文章录入:skyuu    责任编辑:skyuu 
  • 上一篇文章:

  • 下一篇文章:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
    发表评论:
    姓名:  评 分: 1分 2分 3分 4分 5分
     
  • 严禁发表危害国家安全、政治、黄色淫秽等内容的评论。
  • 用户需对自己在使用幽幽天空服务过程中的行为承担法律责任。
  • 本站管理员有权保留或删除评论内容。
  • 评论内容只代表机友个人观点,与本网站立场无关。