和
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