std::binder1st, std::binder2nd
Определён в заголовочном файле <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++.
| Отчёт об ошибке | Применяется к | Поведение согласно опубликованному стандарту | Корректное поведение |
|---|---|---|---|
| LWG 109 | C++98 |
operator() не мог изменять переданный ему аргумент | добавлены перегрузки для обработки этого случая |
См. также
|
(устарело в C++11)(удалено в C++17) | привязывает один аргумент к бинарной функции (шаблон функции) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/utility/functional/binder12