adapter:将一个class的接口转换为另一个class的接口。
应用于仿函数,functor adapters,价值在于通过它们直接的绑定,组合,修饰能力,几乎可以无限制地创造出各种可能的表达式。
配接操作包括系结(bind),否定(negate),组合(compose)、以及对一般函数或成员函数的修饰。
例如:不小于12 可以使用greater_equal的仿函数;
也可以使用not1(bind2nd(less<int>(),12)),即将less<int>()第二个参数系结为12,再加上否定操作。
举例如何设计仿函数自己的配接器:
template<class Operation1,class Operation2>
class unary_compose
: public unary_function<typename Operation2::argument_type,typename Operation1::result_type>//typename不是不能放到基类列中吗?
{
protected:
Operation1 op1;
Operation2 op2;
public:
unary_compose(const Operation1& x,const Operation2& y)
:op1(x),op2(y){}
//嵌套从属名称
typename Operation1::result_type
operator()(const typename Operation2::argument_type& x) const{
return op1(op2(x));
}
};
template<class Operation1,class Operation2>
inline unary_compose<Operation1,Operation2>
compose1(const Operation1& op1,const Operation2& op2)
{
return unary_compose<Operation1,Operation2>(op1,op2);
}
//为什么这个函数在新建的.h文件中就编译不过,报错是语法错误,但是放到xfunctional就可以使用?
函数如何采用配接能力:一元仿函数必须继承unary_function,二元仿函数必须继承自binary_function,成员函数必须以mem_fun处理过,一般函数必须以ptr_fun处理过。