Пространства имён
Варианты
Действия

std::bind

Материал из cppreference.com
< cpp‎ | utility‎ | functional


 
 
 
Функция объектов
Функция обертки
Оригинал:
Function wrappers
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
function(C++11)
mem_fn(C++11)
bad_function_call(C++11)
Привязка
Оригинал:
Bind
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
bind(C++11)
is_bind_expression(C++11)
is_placeholder(C++11)
_1, _2, _3, ...(C++11)
Ссылка обертки
Оригинал:
Reference wrappers
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
reference_wrapper(C++11)
ref
cref
(C++11)
(C++11)
Оператор обертки
Оригинал:
Operator wrappers
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
Negators
Оригинал:
Negators
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
Устаревшие связующих и адаптеры
Оригинал:
Deprecated binders and adaptors
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
unary_function(устарело)
binary_function(устарело)
ptr_fun(устарело)
pointer_to_unary_function(устарело)
pointer_to_binary_function(устарело)
mem_fun(устарело)
mem_fun_t
mem_fun1_t
const_mem_fun_t
const_mem_fun1_t
(устарело)
(устарело)
(устарело)
(устарело)
mem_fun_ref(устарело)
mem_fun_ref_t
mem_fun1_ref_t
const_mem_fun_ref_t
const_mem_fun1_ref_t
(устарело)
(устарело)
(устарело)
(устарело)
binder1st
binder2nd
(устарело)
(устарело)
bind1st
bind2nd
(устарело)
(устарело)
 
Определено в заголовочном файле <functional>
template< class F, class... Args >
/*unspecified*/ bind( F&& f, Args&&... args );
(1) (начиная с C++11)
template< class R, class F, class... Args >
/*unspecified*/ bind( F&& f, Args&&... args );
(2) (начиная с C++11)
bind шаблон функции создает оболочку переадресации вызовов для f. Вызов этой оболочки эквивалентно вызову f с некоторыми из своих аргументов связан с args.
Оригинал:
The function template bind generates a forwarding call wrapper for f. Calling this wrapper is equivalent to invoking f with some of its arguments bound to args.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
Внутри оболочки выполнено членом объекта типа std::decay<F>::type построены из std::forward<F>(f), и один объект на каждом из args..., типа std::decay<Arg_i>::type, аналогично построенные по std::forward<Arg_i>(arg_i).
Оригинал:
Internally, the wrapper holds a member object of type std::decay<F>::type constructed from std::forward<F>(f), and one object per each of args..., of type std::decay<Arg_i>::type, similarly constructed from std::forward<Arg_i>(arg_i).
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

Содержание

[править] Параметры

f -
Invocable объект (объект-функцию, указатель на функцию, ссылка на функцию, указатель на функцию-член, или указатель на элемент данных), который будет связан с некоторыми аргументами
Оригинал:
invocable object (function object, pointer to function, reference to function, pointer to member function, or pointer to member data) that will be bound to some arguments
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
args -
Список аргументов, чтобы связать с несвязанными аргументы заменены _1, _2, _3... заполнителей
Оригинал:
list of arguments to bind, with the unbound arguments replaced by the placeholders _1, _2, _3...
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

[править] Возвращаемое значение

Функция объект неопределенного T типа, для которых std::is_bind_expression<T>::value == true, и которые могут быть сохранены в std::function. Объект является подвижным, если f и все args подвижны, и копируемой иначе. Тип определяет следующие элементы:
Оригинал:
A function object of unspecified type T, for which std::is_bind_expression<T>::value == true, and which can be stored in std::function. The object is movable if f and all args are movable, and is copyable otherwise. The type defines the following members:
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

std::bind:: Return type

Member type result_type

1) If F is a pointer to function or a pointer to member function, result_type is the return type of F. If F is a class type with nested typedef result_type, then result_type is F::result_type. Otherwise no result_type is defined.

2) result_type is exactly R.

Member function operator()

Given an object g obtained from an earlier call to bind, when it is invoked in a function call expression g(u1, u2, ... uM), an invocation of the stored object of type std::decay<F>::type takes place, with arguments defined as follows:

  • If the argument is of type std::reference_wrapper<T> (e.g. std::ref or std::cref) was used in the initial call to bind, then the reference T& stored in the bound argument is passed to the invocable object.
  • If std::is_bind_expression<T>::value == true (i.e. another sbind subexpression was used as an argument in the initial call to bind), then that bind-subexpressin is invoked immediately and its result is passed to the invocable object. If the bind subexpression has any placeholder arguments, they are picked from u1, u2, ....
  • If std::is_placeholder<T>::value != 0 (i.e., _1, _2, _3, ... was used as the argument to the initial call to bind), then the argument indicated by the placeholder (u1 for _1, u2 for _2, etc) is passed to the invocable object as std::forward<Uj>(uj).
  • Otherwise, the stored argument is passed to the invocable object as-is.

If some of the arguments that are supplied in the call to g() are not matched by any placeholders stored in g, the unused arguments are evaluated and discarded.

[править] Исключения

Только бросает, если строительство std::decay<F>::type от std::forward<F>(f) бросает, или любой из конструкторов для std::decay<Arg_i>::type от corrsponding std::forward<Arg_i>(arg_i) бросает где Arg_i это-го типа и arg_i является й аргумент в Args... args.
Оригинал:
Only throws if construction of std::decay<F>::type from std::forward<F>(f) throws, or any of the constructors for std::decay<Arg_i>::type from the corrsponding std::forward<Arg_i>(arg_i) throws where Arg_i is the ith type and arg_i is the ith argument in Args... args.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

[править] Заметки

Аргументы для связывания будут скопированы или перемещены, и никогда не передается по ссылке, если завернутые в std::ref или std::cref.
Оригинал:
The arguments to bind are copied or moved, and are never passed by reference unless wrapped in std::ref or std::cref.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.
Дубликат заполнителей в то же выражение привязки (несколько _1, например) допускаются, но результаты только хорошо определены, если соответствующий аргумент (u1) является именующее или неподвижными RValue.
Оригинал:
Duplicate placeholders in the same bind expression (multiple _1's for example) are allowed, but the results are only well defined if the corresponding argument (u1) is an lvalue or non-movable rvalue.
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

[править] Пример

#include <random>
#include <iostream>
#include <functional>
 
void f(int n1, int n2, int n3, const int& n4, int n5)
{
    std::cout << n1 << ' ' << n2 << ' ' << n3 << ' ' << n4 << ' ' << n5 << '\n';
}
 
int g(int n1)
{
    return n1;
}
 
struct Foo {
    void print_sum(int n1, int n2)
    {
        std::cout << n1+n2 << '\n';
    }
    int data = 10;
};
 
int main()
{
    using namespace std::placeholders;
 
    // demonstrates argument reordering and pass-by-reference
    int n = 7;
    auto f1 = std::bind(f, _2, _1, 42, std::cref(n), n);
    n = 10;
    f1(1, 2, 1001); // 1 is bound by _1, 2 is bound by _2, 1001 is unused
 
    // nested bind subexpressions share the placeholders
    auto f2 = std::bind(f, _3, std::bind(g, _3), _3, 4, 5);
    f2(10, 11, 12);
 
    // common use case: binding a RNG with a distribution
    std::default_random_engine e;
    std::uniform_int_distribution<> d(0, 10);
    std::function<int()> rnd = std::bind(d, e);
    for(int n=0; n<10; ++n)
        std::cout << rnd() << ' ';
    std::cout << '\n';
 
    // bind to a member function
    Foo foo;
    auto f3 = std::bind(&Foo::print_sum, foo, 95, _1);
    f3(5);
 
    // bind to member data
    auto f4 = std::bind(&Foo::data, _1);
    std::cout << f4(foo) << '\n';
}

Вывод:

2 1 42 10 7
12 12 12 4 5
1 5 0 2 0 8 2 2 10 8
100
10

[править] См. также

заполнители для несвязанных аргументы в std::bind выражение
Оригинал:
placeholders for the unbound arguments in a std::bind expression
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

(константа) [edit]
(C++11)
создает объект функции из указателя на член
Оригинал:
creates a function object out of a pointer to a member
Текст был переведён автоматически через Google Translate.
Вы можете проверить и исправить перевод. Для инструкций кликните сюда.

(шаблон функции) [edit]