游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2376|回复: 2

《解析boost》(一)

[复制链接]

15

主题

83

帖子

123

积分

注册会员

Rank: 2

积分
123
发表于 2004-4-9 08:29:00 | 显示全部楼层 |阅读模式
(一)any
在写程序中,我们往往需要在运行期保存一个“泛型”的对象的指针,也就是说这个指针可能是任何对象的指针,这种情况下,我们一般都是把这个指针cast成一个void*或者一个int,然后在需要的时候再cast回来,这样往往缺乏型别安全,况且我们的程序员都喜欢使用C的转型操作而非C++的转型操作,从而导致一个T*指针被cast成一个U*的指针而编译器却不做任何表示,为了确保型别安全,这个时候我们应该在转型前进行型别检查,看这样的转型是否正确。而boost::any就帮助我们完成了这件事。他的具体实现原理是这样的:

template<typename ValueType>
class any
{
        ...
        placeholder * content;  //一个接口指针,你可以先不管
};

template<typename ValueType>
any(const ValueType & value) : content(new holder<ValueType>(value)) {}

template<typename ValueType>
any & operator=(const ValueType & rhs)
{
     any(rhs).swap(*this);
     return *this;
}

上面的原理就是通过模板的实参演绎,把对象的型别通过“伪拷贝构造函数”和“伪等于操作符”传递给一个nest class,这个class就是:

template<typename ValueType> class holder;

holder保存了一个我们传递给他的值,并暴露一个获得std::type_info&和克隆自己的接口,这样就把刚才编译器通过我们传递的对象而进行的实参演绎得到型别信息通过运行期的std::type_info导了出来。如下:

class placeholder
{
public:
        virtual ~placeholder() {}

        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) { }

        virtual const std::type_info & type() const
        {
            return typeid(ValueType);
        }

        virtual placeholder * clone() const
        {
            return new holder(held);
        }

        ValueType held;
};

最后,我们得到了型别信息,但是我们还没有使用他,boost通过提供了下面的帮助函数来方便我们的使用:请看核心的一个:

template<typename ValueType>
ValueType * any_cast(any * operand)
{
   return operand && operand->type() == typeid(ValueType)
           ? &static_cast<any::holder<ValueType> *>(operand->content)->held : 0;
}

我们获得了一个方便的工具,更重要的是我们获得了一种把一个对象的型别进行封装的方法,具体的方法如下:
1。型别和对象不是同一个级的,我们传入对象的时候必须指定型别,但是我们却可以把这个指定过程委托给编译器来完成(实参演绎)
2。我们只能使用型别来“保存”型别,但是我们却可以使用一个内建型别来帮助我们保存型别,从而使外部型别是唯一的。
3。要从多个型别导出方法,可以使用接口来模糊型别的差异


因为水平平庸,必然有错误的理解,请高手不吝指出为谢。《解析boost》

90

主题

797

帖子

833

积分

高级会员

论坛版主

Rank: 4

积分
833
QQ
发表于 2004-4-9 22:36:00 | 显示全部楼层

Re:《解析boost》(一)

我用boost.python,其他的还没有接触过,多来点这类文章,支持先

15

主题

83

帖子

123

积分

注册会员

Rank: 2

积分
123
 楼主| 发表于 2004-4-12 07:53:00 | 显示全部楼层

Re:《解析boost》(一)

好的,我最近很忙,有时间我就尽我所能写点,希望大家看了能有点用我就最高兴了。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-5-16 16:04

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表