Boost::any分析

转载 2005年04月27日 17:32:00

 

boost::any是一个能代表任何对象类型的对象,正如COM库的Variant变量类型,以及JAVA中的Object。不同的是,Variant的做法是包含所有可能类型的一个成员实现,浪费空间,而则boost::any借助于模板,没有空间浪费。

Variant的大致实现是:

Class Cvariant

{

       int   iData;

         long lData;

       ….

       Int   type;

}

boost::any则使用模板,依靠两个内部类来封装实际数据(PlaceFolderFolder),并对外暴露一个叫做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 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;

}

 

以上就是boost::any源代码的关键部分,其实很短小,但是,功能上非常强大,特别是在配合容器使用时。

boost::any实现分析

这里提到的boost::any,下面来分析一下boost::any的实现。 class any { public: // structors any() ...
  • zp373860147
  • zp373860147
  • 2013年03月19日 17:09
  • 2392

boost::any库的使用

boost::any库的用法 最近尝试用boost库,作为另一代的C++标准,boost库确实很优秀。 boost::any可以存放任何类型的C++类型,也可以是用户自定义的类型。非常方便,可以很...
  • chenzulong198867
  • chenzulong198867
  • 2012年12月13日 15:46
  • 5746

boost::any的使用和扩展

前言 boost::any类为我们提供了一个十分强大的功能:只要定义一个any对象,就可以保存任意类型的数据到这个对象中,而且还可以动态改变类型。这比我么在COM中使用到的VARIANT结构要强...
  • mfcing
  • mfcing
  • 2015年03月28日 21:12
  • 3783

boost.any源码整理和使用说明

Source#include #include  #include "boost/config.hpp"#include #include #include #include  namespace k...
  • laibach0304
  • laibach0304
  • 2007年08月24日 22:44
  • 562

boost::any基本用法

boost::any的基本用法
  • morning_color
  • morning_color
  • 2015年09月23日 15:37
  • 1410

boost::any类型实现原理

boost::any是一种通用类型,可以存放任意值。 问题:通用类型any如何存放任意值? A: 这里的通用类型类似于脚本语言中的类型。 方案一, union结构体:但union只能存放固定种类的值,...
  • u012702526
  • u012702526
  • 2014年04月03日 21:20
  • 1359

Boost中的容器boost::any

导言 Boost.any的特性 – 能够保存任意类型的变量,这和STL有很大的不同; – 模拟动态类型; – 类型安全:不对存入any的变量进行类型强制转换; – 异常安全; – 可写出动态...
  • iFuMI
  • iFuMI
  • 2016年06月12日 14:12
  • 443

boost::any 使用注意问题

boost::any 使用注意问题 flyfish   编译环境  VC2010 看如下代码 void function(boost::any T) { try { BYT...
  • flyfish1986
  • flyfish1986
  • 2015年01月06日 13:47
  • 1680

boost.any实现任意类型存储

当你需要一个可变的类型时,有三种可能的解决方案: 无限制的类型,如 void*. 这种方法不可能是类型安全的,应该象逃避灾难一样避免它。可变的类型,即支持多种类型的存储和获取的类型。支持转换的类型,...
  • IT_PCode
  • IT_PCode
  • 2015年01月16日 11:23
  • 1435

Boost::any分析

使用第三方库 以上介绍了Visual C++对对象赋值、转换及字符编码转换的方法,实际上还有一些好用的第三方类库用以辅助C++程序员完成对象处理,比较著名的就是boost。本节简单介绍boost库...
  • flyingleo1981
  • flyingleo1981
  • 2013年09月24日 16:44
  • 821
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Boost::any分析
举报原因:
原因补充:

(最多只允许输入30个字)