操纵器(Manipalator),以某种方式作用于它的参数所表示的数据;应用器(Applicator),是一个重载操作符,它的操作数是一个可操纵的值和一个将作用于这个值得操纵器。
template <class stype,class vtype >
class fcn_obj
{
public:
fcn_obj(stype (f)(stype&,vtype),vtype v):
func(f),val(v)
{
}
stype& operator()(stype& s)const
{
return (func)(s,val);
}
private:
stype& (*func)(stype&,vtype),vtype v);
vtype val;
};
template <class stype,class vtype>
stype& operator<<
(stype& ofile,const fcn_obj<stype,vtype>& im)
{
return im(ofile);
}
fun_obj<ostream long>
hexconv(long n)
{
ostream (*my_hex)(ostream&,long)=hexconv;
return fcn_obj<ostream,long>(my_hex,n);
}
上面的代码来自Ruminations On C++,iostream库中使用了这个设计,使得cout<<”Hello,World!”<<endl;用起来很舒服,终于知道了endl为什么叫做操纵器了。