函数适配器,是去修饰函数,然后还要表现出函数的性质。所以最终还是要重载(),以表现出函数。
binder2nd来绑定第二个参数,之前less是x<y,现在是x<40。less< int>()是创建了一个函数对象,不是调用。
bind2nd调用了binder2nd,那么最终的效果是less< int>()传进去变成op,40传进去变成value。
bind2nd调用过程,重点: 当执行pred(*first)调用的是operator()这个小括号重载函数,才真正调用了less。左下角的bind2nd(less< int>,40):这里调用的是bind2nd的构造函数,并把less< int>和40分别赋值给op和value。
所以,适配器只是先记下来,也没有绑定。只有在真正被调用,才会绑定起来。
binder2nd< Operation >是一个类型,加了()是创建一个临时对象。
接下来注意灰色的部分,灰色部分会问三个问题:less的第一个实参是什么type,第二个,和返回的类型都是什么参数。如果能回答这三个问题的函数,被称为函数适配器。
灰色部分的前面有typename,是为了在编译过程中帮助编译器理解后面紧跟的是一个typename(类型),防止编译器出现困惑。
这里还要细节:binder2nd继承了unary_function。binder2nd本身适配了函数,而成为一个新的函数。但是它也可以被适配,由于现在已经确定了一个参数40,所以只剩下一个待传参数。为了能够让_not1适配,就要继承unary_function,然后回答那些问
侯捷C++ stl体系结构与源码剖析:函数适配器详解,C++11新特性bind
![](https://img-home.csdnimg.cn/images/20240711042549.png)