std::binder1st, std::binder2nd
Материал из ru.cppreference.net
| Определён в заголовочном файле <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); // 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 | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 109 | C++98 |
operator()
could not modify to argument passed to it
|
added overloads to handle this |
Смотрите также
|
(устарело в C++11)
(удалено в C++17)
|
связывает один аргумент с бинарной функцией
(шаблон функции) |