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 学习之算法篇 any_of 与 any_of_equal

any_of 与any_of_equal 这个算法测试一个序列的元素,假如有任何一个元素拥有特定的属性,则返回true。此处的特定指的是(和算法所带的参数比较能够返回true) 常用的any_of 带...

C++“准”标准库Boost学习指南(6):Boost.Any

Boost.Any Any库支持类型安全地存储和获取任意类型的值。当你需要一个可变的类型时,有三种可能的解决方案: 无限制的类型,如 void*. 这种方法不可能是类型安全的,应该象逃避灾...
  • cbNotes
  • cbNotes
  • 2016年10月19日 14:42
  • 872

C++“准”标准库Boost学习指南(6):Boost.Any

Boost.Any Any库支持类型安全地存储和获取任意类型的值。当你需要一个可变的类型时,有三种可能的解决方案: 无限制的类型,如 void*. 这种方法不可能是类型安全的,应该象逃避灾...
  • cbNotes
  • cbNotes
  • 2016年10月19日 14:11
  • 55

boost::any的使用和扩展

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

boost.any实现任意类型存储

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

boost::any实现分析

这里提到的boost::any,下面来分析一下boost::any的实现。 class any { public: // structors any() ...

boost::any任意类别容器

boost::any是个容器,而且可以用任意类别构造。
  • MDLFANS
  • MDLFANS
  • 2014年06月29日 21:28
  • 1377

boost::any

4.6.1 万能类型boost::any2009-07-08 11:51 白乔/左飞 电子工业出版社 我要评论(0) 字号:T | T《把脉VC++》第4章对象的赋值与转换,本章介绍了对象的初始...
  • Sloudy
  • Sloudy
  • 2011年07月05日 10:48
  • 409

Boost库之tuple、any和variant的使用

Boost库中提供了三种比较实用的数据结构,分别是tuple、any和variant。它们的共同优点就是支持类型安全地存储和获取数据。灵活地使用这三种数据结构,对我们进行程序设计无疑是大有裨益的。下面...

对Boost::any的一个补充

Boost::any可以存取任意类型,是用模板实现的,不过它设计得非常巧妙,其本身不是个模板,而是用一个模板类的成员来进行数据存储的,这使得我们可以写出这样的代码: boost::any x...
  • ibingow
  • ibingow
  • 2011年12月28日 23:11
  • 621
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Boost 学习 ――Any篇
举报原因:
原因补充:

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