函数适配器,是去修饰函数,然后还要表现出函数的性质。所以最终还是要重载(),以表现出函数。
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
可适配的条件:less所继承的binary_function就有第一参数,第二参数,返回参数的type。
侯捷C++ stl体系结构与源码剖析:函数适配器详解,C++11新特性bind
_not1适配器:接着套娃了。
侯捷C++ stl体系结构与源码剖析:函数适配器详解,C++11新特性bind

新型适配器:
侯捷C++ stl体系结构与源码剖析:函数适配器详解,C++11新特性bind
C++11新特性:bind
由于要用到占位符,所以using namespace std::placeholders。_1,_2就是占位符,占位符是为了表示第一、第二参数。bind可以传入一个参数,用来指定返回的类型。
下面绑定成员函数时:
bind后面有一个参数时_1,其实这里占位符是留着来指代this,接下来调用时需要一个对象来绑定this。
下面第二个栗子,直接绑定好了ten_two,所以直接()调用。还可以绑定data members,比如绑定第二个参数b。
还有一个用bind取代bind2nd的栗子。
侯捷C++ stl体系结构与源码剖析:函数适配器详解,C++11新特性bind

相关文章:

  • 2022-12-23
  • 2021-12-19
  • 2021-08-02
  • 2021-04-23
  • 2021-07-31
  • 2021-11-09
  • 2021-11-28
  • 2022-01-21
猜你喜欢
  • 2021-09-13
  • 2021-04-13
  • 2021-08-01
  • 2021-08-05
  • 2021-11-28
  • 2021-09-21
  • 2021-10-24
相关资源
相似解决方案