std::binder1st, std::binder2nd
定义在头文件 <functional> 中 |
||
template< class Fn > class binder1st |
(1) | (C++11 中已弃用) (C++17 中已移除) |
template< class Fn > class binder2nd |
(2) | (C++11 中已弃用) (C++17 中已移除) |
一个将参数绑定到二元函数的函数对象。
参数的值在对象构造时传递给对象并存储在对象中。每当函数对象通过 operator()
调用时,存储的值将作为参数之一传递,另一个参数将作为 operator()
的参数传递。生成的函数对象是一个一元函数。
[编辑] 示例
#include <cmath> #include <functional> #include <iostream> #include <vector> const double pi = std::acos(-1); // use std::numbers::pi in C++20 int main() { // deprecated in C++11, removed in C++17 auto f1 = std::bind1st(std::multiplies<double>(), pi / 180.0); // C++11 replacement auto f2 = [](double a) { return a * pi / 180.0; }; for (double n : {0, 30, 45, 60, 90, 180}) std::cout << n << "°\t" << std::fixed << "= " << f1(n) << " rad (using binder)\t= " << f2(n) << " rad (using lambda)\n" << std::defaultfloat; }
输出
0° = 0.000000 rad (using binder) = 0.000000 rad (using lambda) 30° = 0.523599 rad (using binder) = 0.523599 rad (using lambda) 45° = 0.785398 rad (using binder) = 0.785398 rad (using lambda) 60° = 1.047198 rad (using binder) = 1.047198 rad (using lambda) 90° = 1.570796 rad (using binder) = 1.570796 rad (using lambda) 180° = 3.141593 rad (using binder) = 3.141593 rad (using lambda)
[编辑] 缺陷报告
以下行为变更缺陷报告已追溯应用到先前发布的 C++ 标准。
DR | 应用于 | 已发布的行为 | 正确行为 |
---|---|---|---|
LWG 109 | C++98 | operator() 无法修改传递给它的参数 |
添加了重载来处理这种情况 |
[编辑] 参见
(C++11 中已弃用)(C++17 中已移除) |
将一个参数绑定到二元函数 (函数模板) |