小山日志
读书,学习与思考.
posts - 9,comments - 14,trackbacks - 0

STL utility 一样, boost/utility 里包含了一些实用的小工具。

首先是   Base-from-Member

有时你可能需要依赖成员变量来初始化基类,像这样:

class  fdoutbuf
    : 
public  std::streambuf
{
public :
    
explicit  fdoutbuf(  int  fd );
    
//
};

class  fdostream
    : 
public  std::ostream
{
protected :
    fdoutbuf buf;
public :
    
explicit  fdostream(  int  fd )
        : buf( fd ), std::ostream( 
& buf )
        {}
    
//
};


但是,这里 fdostream 的构造函数的初始化是错误的,因为 c++ 语法要求基类的初始化要先于成员变量的初始化。 Base-from-Member 提供的解决之道如下:

class  fdoutbuf
    : 
public  std::streambuf
{
public :
    
explicit  fdoutbuf(  int  fd );
    
//
};

class  fdostream
    : 
private  boost::base_from_member < fdoutbuf >
    , 
public  std::ostream
{
    
//  Helper typedef's
    typedef boost::base_from_member
< fdoutbuf >   pbase_type;
    typedef std::ostream                        base_type;
public :
    
explicit  fdostream(  int  fd )
        : pbase_type( fd ), base_type( 
& member )
        {}
    
//
};

模板类
template < typename MemberType, int UniqueID = 0 >
        class boost::base_from_member;
是一个外覆类(姑且这么叫了 ^_^ )。
如上,私有继承
base_from_member ,原先的成员变量将做为 base_from_member 的成员变量 member 先于基类 base_type 初始化,这样所需的依赖关系可以满足。事实上比这更好的是, base_from_member 的构造函数是模板函数,它可以有 0 10 个参数,参数类型可以各不相同。
posted on 2006-08-11 23:59 小山日志 阅读(510) 评论(0)  编辑 收藏 引用 所属分类: stl/boost/loki/generically

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理