Boost 学习 ――Any篇

原创 2005年04月24日 23:32:00

Boost 学习 ――Any篇

boost::any — 他的对象,可以容纳任何满足值类型(ValueType)的类型的对象。J(谁在忽悠呢?)
ValueType 要求:
代码分析:
class any
{
public: // structors
    any() : content(0)   { }
    template<typename ValueType>
    any(const ValueType & value) : content(new holder<ValueType>(value)) {}
 
    any(const any & other) : content(other.content ? other.content->clone() : 0) {}
   
    ~any() //Releases any and all resources used in management of instance
    { delete content; }
public: // modifiers
    any & swap(any & rhs)
    {
       std::swap(content, rhs.content); //目的是交换content指针
       return *this;
    }
 
    template<typename ValueType>
    any & operator=(const ValueType & rhs)
    {
       any(rhs).swap(*this);
       return *this;
    }
 
    any & operator=(const any & rhs)
    {
       any(rhs).swap(*this);
       return *this;
    }
 
public: // queries
    bool empty() const //true if instance is empty
    {
       return !content; //学习,学习,如此简洁的代码
    }
    const std::type_info & type() const
    {
       return content ? content->type() : typeid(void);
    }
public:
 
//内部代理类
    class placeholder
    {
    public: // structors
       virtual ~placeholder()
       {
       }
 
    public: // queries
 
       virtual const std::type_info & type() const = 0;
 
       virtual placeholder * clone() const = 0;
 
    };
 
    template<typename ValueType>
    class holder : public placeholder
    {
    public: // structors
 
       holder(const ValueType & value) : held(value)
       {
       }
 
    public: // queries
 
       virtual const std::type_info & type() const
       {
           return typeid(ValueType);
       }
 
       virtual placeholder * clone() const
       {
           return new holder(held);
       }
 
    public: // representation
 
       ValueType held; //实际的数据,它被包了两层外衣。
    };
 
public: // representation (public so any_cast can be non-friend)
    placeholder * content;//指向容纳ValueType对象的指针
};
转型代码:
template<typename ValueType>
ValueType * any_cast(any * operand)
{
    return operand && operand->type() == typeid(ValueType)
       ? &static_cast<any::holder<ValueType> *>
(operand->content)->held : 0;
}
 
template<typename ValueType>
const ValueType * any_cast(const any * operand)
{
    return any_cast<ValueType>(const_cast<any *>(operand));
}
 
template<typename ValueType>
ValueType any_cast(const any & operand)
{
    const ValueType * result = any_cast<ValueType>(&operand);
    if(!result)
       throw(bad_any_cast());
    return *result;
}
用处:
1:
在通常情况下,我们一个容器只能容纳一种类型,或者一种类型继承体系。一直如此,但是可以通过包一层解决这个问题。
Any 是所有类型的衣衫,所有类型的对象穿上他之后,就成了any ,而存储any类型的容器,当然可以存储any对象,而不用管 any内部存储的是什么内容。
2: 这个世界就剩下一种类型了。
内存布局:
下面图示了两种类型,int,string。

实际测试:

#include <iostream>
#include <string>
#include "Any.hpp"
 
using namespace std;
int main()
{
    string str("I believe i can fly.");
    any test(str);
    int t;
 
    try
    {
       t = any_cast<int>(test);
    }
    catch(bad_any_cast& exp)
    {
       std::cout<<exp.what() <<endl;
    }
 
    any inta(5);
test.swap(inta);//将存储string内容的any 和int 类型的any 交换内容。J
 
    try
    {
       t = any_cast<int>(test);
    }
    catch(bad_any_cast& exp)
    {
       std::cout<<exp.what() <<endl;
       }
}

boost使用学习总结

boost常用库案例 http://www.cnblogs.com/wangkangluo1/archive/2011/07/19/2110746.html 1.boost::any boost:...
  • bcbobo21cn
  • bcbobo21cn
  • 2016年07月30日 10:05
  • 1299

boost::any库的使用

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

boost::any的使用和扩展

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

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

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

boost::any实现分析

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

boost::any基本用法

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

Boost中的容器boost::any

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

boost::any类型实现原理

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

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
  • 1430
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Boost 学习 ――Any篇
举报原因:
原因补充:

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