编写可适配的函数对象
Effective STL
Effective
STL
书中条款
40
提到,要使我们自己写的仿函数类可适配,仿函数类必须从类
unary_function
或者
binary_function
继承,因为这两个类提供了对象适配器需要的
typedef
。
list<Widget>
widgets;
//...
list<Widget>::reverse_iterator i1 = //找到最后一个不
find_if(widgets.rbegin(), widgets.rend(),//合阈值的widget
not1(MeetsThreshold<int>(10)));//不管意味着什么)
Widget w(构造函数实参);
list<Widget>::iterator i2 = //找到第一个在由
find_if(widgets.begin(), widgets.end(), //WidgetNameCompare定义
bind2nd(WidgetNameCompare(), w);// 的排序顺序上先于w的widget
//...
list<Widget>::reverse_iterator i1 = //找到最后一个不
find_if(widgets.rbegin(), widgets.rend(),//合阈值的widget
not1(MeetsThreshold<int>(10)));//不管意味着什么)
Widget w(构造函数实参);
list<Widget>::iterator i2 = //找到第一个在由
find_if(widgets.begin(), widgets.end(), //WidgetNameCompare定义
bind2nd(WidgetNameCompare(), w);// 的排序顺序上先于w的widget
如果我们没有把仿函数类继承自
unary_function
或
binary_function
,这些例子都不能编译,因为
not1
和
bind2nd
都只和可适配的函数对象合作。书上告诉我们的理由是:对象适配器需要
unary_function
或
binary_function
提供的
typedef
才能工作,所以我们的仿函数类必须继承自这两个类。
按照这个理由编写的仿函数类确实能很好的配合类适配器工作,但是,这两个神秘的类到底做了些什么呢?为了搞清楚这两个的类,最好的办法还是把源码搬出来,看看它到底做了些什么。
以plus和bind1st为例来作分析。plus是一个可适配的类,继承自binary_function,可以和适配器bind1st合作,这些函数和类都在functional头文件中。
先来这个unary_function类:
// TEMPLATE STRUCT unary_function
template<class _Arg,class _Result>
struct unary_function
{ // base class for unary functions
template<class _Arg,class _Result>
struct unary_function
{ // base class for unary functions
typedef _Arg argument_type;//参数类型
typedef _Result result_type;//函数返回类型
} ;