Spec-Zone.ru › C++

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++.

DR Применимо к Поведение, как опубликовано Правильное поведение
LWG 109 C++98 operator() не могла изменить аргумент, переданный ей Добавлены перегрузки для обработки этого

См. также

bind1stbind2nd
(устарело в C++11)(удалено в C++17)
связывает один аргумент с бинарной функцией
(шаблон функции)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/utility/functional/binder12

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API