std::binder1st, std::binder2nd
Материал из cppreference.com
<tbody>
</tbody>
| Определено в заголовочном файле <functional>
|
||
template< class Fn > class binder1st : public std::unary_function<typename Fn::second_argument_type, typename Fn::result_type> { protected: Fn op; typename Fn::first_argument_type value; public: binder1st(const Fn& fn, const typename Fn::first_argument_type& value); typename Fn::result_type operator()(const typename Fn::second_argument_type& x) const; typename Fn::result_type operator()(typename Fn::second_argument_type& x) const; }; |
(1) | (устарело в C++11) (удалено в C++17) |
template< class Fn > class binder2nd : public std::unary_function<typename Fn::first_argument_type, typename Fn::result_type> { protected: Fn op; typename Fn::second_argument_type value; public: binder2nd(const Fn& fn, const typename Fn::second_argument_type& value); typename Fn::result_type operator()(const typename Fn::first_argument_type& x) const; typename Fn::result_type operator()(typename Fn::first_argument_type& x) const; }; |
(2) | (устарело в C++11) (удалено в C++17) |
Функциональный объект, который связывает аргумент с бинарной функцией.
Значение параметра передаётся объекту во время конструирования и сохраняется внутри объекта. Всякий раз, когда функциональный объект вызывается через operator(), сохранённое значение передаётся как один из аргументов, а другой аргумент передаётся как аргумент operator(). Результирующий функциональный объект является унарной функцией.
1) Связывает первый параметр со значением
value, заданным при конструировании объекта.2) Связывает второй параметр со значением
value, заданным при конструировании объекта.Пример
Запустить этот код
#include <cmath>
#include <functional>
#include <iostream>
#include <vector>
const double pi = std::acos(-1); // используйте std::numbers::pi в C++20
int main()
{
// устарело в C++11, удалено в C++17
auto f1 = std::bind1st(std::multiplies<double>(), pi / 180.);
// Замена C++11
auto f2 = [](double a){ return a * pi / 180.; };
for (double n : {0, 30, 45, 60, 90, 180})
std::cout << n << "°\t" << std::fixed << "= "
<< f1(n) << " радиан (используя связующего)\t= "
<< f2(n) << " радиан (используя лямбду)\n"
<< std::defaultfloat;
}
Вывод:
0° = 0.000000 радиан (используя связующего) = 0.000000 радиан (используя лямбду)
30° = 0.523599 радиан (используя связующего) = 0.523599 радиан (используя лямбду)
45° = 0.785398 радиан (используя связующего) = 0.785398 радиан (используя лямбду)
60° = 1.047198 радиан (используя связующего) = 1.047198 радиан (используя лямбду)
90° = 1.570796 радиан (используя связующего) = 1.570796 радиан (используя лямбду)
180° = 3.141593 радиан (используя связующего) = 3.141593 радиан (используя лямбду)
Отчёты о дефектах
Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:
| Номер | Применён | Поведение в стандарте | Корректное поведение |
|---|---|---|---|
| LWG 109 | C++98 | operator() не может изменить переданный ему аргумент
|
добавлены перегрузки для обработки этого случая |
Смотрите также
(устарело в C++11)(удалено в C++17) |
связывает один аргумент с бинарной функцией (шаблон функции) |