16.5.3 自适应函数符和函数适配器
STL有五个函数符自适应的相关概念:
- 自适应生成器
- 自适应一元函数
- 以适应二元函数
- 自适应谓词
- 自适应二元谓词
函数符成为自适应的原因是,它携带了标识参数类型和返回类型的typedef成员,这些成员分别是:
- result_type
- first_argument_type
- second_argument_type
例如plus<int>对象的返回类型被标识为plus<int>::result_type,此为int的typedef
### 函数符自适应的意义在于:函数适配器对象可以使用函数对象,并认为存在这些typedef成员。
例如,接受一个自适应函数符参数的函数可以使用result_type成员来声明一个与函数的返回类型匹配的
变量
STL提供了使用这些工具的函数适配器类,其中的例子有binder1st、binder2nd类,作用是将接受两个参数的函数
转换为接受一个参数的函数符(将自适应二元函数转换为自适应一元函数)。
binder1st类:
f2是一个自适应二元函数对象,可创建f1: binder1st(f2, val) f1; // val是第一个参数的特定值
f1是一个创建的binder1st对象,它与一个将被用作f2( )的第一个参数的特定值(val)相关联。
### 这样,使用单个参数调用f1(x)时,返回的值与将val作为第一参数、将f1( )的参数作为第二参数调用f2( )返回的
### 值相同,即: f1(x); 等价于 f2(val, x);
bind1st函数:
STL提供了比binder1st更方便的bind1st()函数,向其提供用于构建binder1st对象的函数名称和值,它将返回一个这
种类型的对象。
### 如: bind1st(multiplies<double>(), 2.5) 返回一个对象等价于声明一个f1对象
### binder1st(multiplies<double>(), 2.5) f1;
binder2ed类:
### 工作方式与binder1st相似,只是将常数赋给第二个参数,而不是第一个参数。
### 同样,它有一个名为 bind2ed 的助手函数,该助手函数的工作方式类似于bind1st。