Namespaces
Variants

std::binder1st, std::binder2nd

Материал из ru.cppreference.net
 
 
Библиотека утилит
Поддержка языка
Поддержка типов (базовые типы, RTTI)
Макросы тестирования возможностей библиотеки (C++20)
Программные утилиты
Функции с переменным числом аргументов
Поддержка корутин (C++20)
Поддержка контрактов (C++26)
Трёхстороннее сравнение
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

Общие утилиты
Операторы отношений (устарело в C++20)
 
Объекты-функции
Вызов функций
(C++17)(C++23)
Объект-функция тождественности
(C++20)
Старые связыватели и адапторы
(до C++17*)
(до C++17*)
(до C++17*)
(до C++17*)
(до C++17*)(до C++17*)(до C++17*)(до C++17*)
(до C++20*)
(до C++20*)
(до C++17*)(до C++17*)
(до C++17*)(до C++17*)

(до C++17*)
(до C++17*)(до C++17*)(до C++17*)(до C++17*)
(до C++20*)
(до C++20*)
 
Определён в заголовочном файле <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)
связывает один аргумент с бинарной функцией
(шаблон функции)