Поделиться через


Функция bind

Привязывает аргументы можно вызвать в объект.

template<class Fty, class T1, class T2, ..., class TN>
   unspecified bind(Fty fn, T1 t1, T2 t2, ..., TN tN);
template<class Ret, class Fty, class T1, class T2, ..., class TN>
   unspecified bind(Fty fn, T1 t1, T2 t2, ..., TN tN);

Параметры

  • Fty
    Тип объекта в вызов.

  • TN
    Тип аргумента элемент последовательности вызова.

  • fn
    Объект к вызову.

  • tN
    Nth аргумент вызова.

Заметки

Типы Fty, T1, T2, ..., TN должны быть копией constructible и INVOKE(fn, t1, ..., tN) должно быть допустимым выражением для некоторых значений w1, w2, ..., wN.

Первая шаблонная функция возвращает программа-оболочка g вызова препровождения со слабым типом результата. Эффект g(u1, u2, ..., uM)INVOKE(f, v1, v2, ..., vN, Класс result_of<Fty cv (V1, V2, ..., VN)>::type), где cv резюме- квалификаторы g и значения и типы аргументов ограниченных v1, v2, ..., vN определены, как описано ниже. Он используется для привязки к объекту аргументы можно вызвать, чтобы сделать можно вызвать объект с портняжничанным списком аргументов.

Вторая шаблонная функция возвращает программа-оболочка g вызова препровождения с вложенным типом result_type, синоним для Ret. Эффект g(u1, u2, ..., uM)INVOKE(f, v1, v2, ..., vN, Ret), где cv резюме- квалификаторы g и значения и типы аргументов ограниченных v1, v2, ..., vN определены, как описано ниже. Он используется для привязки к объекту аргументы можно вызвать, чтобы сделать можно вызвать объект с портняжничанным списком аргументов и с указанным типом возвращаемого значения.

Значения аргументов ограниченных v1, v2, ..., vN и соответствующих типов V1, V2, ..., VN зависят от типа соответствующего аргумента ti типа Ti в вызове bind и резюме- квалификаторов cv программы-оболочки g вызова следующим образом:

если ti типа reference_wrapper<T>, аргумент viti.get() и его тип ViT&;

если значение std::is_bind_expression<Ti>::valuetrue, аргумент viti(u1, u2, ..., uM) и его тип Viresult_of<Ti cv (U1&, U2&, ..., UN&>::type;

если значение jstd::is_placeholder<Ti>::value не равно нулю, то аргумент viuj и его тип ViUj&;

в противном случае аргумент viti и его тип ViTi cv &.

Например, при использовании функции f(int, int) выражение bind(f, _1, 0) возвращает программа-оболочка cw вызова препровождения так, что cw(x) вызывает f(x, 0). Выражение bind(f, 0, _1) возвращает программа-оболочка cw вызова препровождения так, что cw(x) вызывает f(0, x).

Количество аргументов в вызове bind в дополнение к аргументу fn должно быть равно числу аргументов, передаваемых можно вызвать объект fn. Таким образом, bind(cos, 1.0) правильно и bind(cos) и bind(cos, _1, 0.0) неверны.

Количество аргументов в вызове функции в программе-оболочке вызова возвращенной bind должно быть по крайней мере большим как наибольшее значение пронумерованное is_placeholder<PH>::value всех аргументов заполнителей в вызове bind. Таким образом, bind(cos, _2)(0.0, 1.0) правильно (и возвращает cos(1.0)) и bind(cos, _2)(0.0) неправильно.

Пример

 

// std_tr1__functional__bind.cpp 
// compile with: /EHsc 
#include <functional> 
#include <algorithm> 
#include <iostream> 
 
using namespace std::placeholders; 
 
void square(double x) 
    { 
    std::cout << x << "^2 == " << x * x << std::endl; 
    } 
 
void product(double x, double y) 
    { 
    std::cout << x << "*" << y << " == " << x * y << std::endl; 
    } 
 
int main() 
    { 
    double arg[] = {1, 2, 3}; 
 
    std::for_each(&arg[0], arg + 3, square); 
    std::cout << std::endl; 
 
    std::for_each(&arg[0], arg + 3, std::bind(product, _1, 2)); 
    std::cout << std::endl; 
 
    std::for_each(&arg[0], arg + 3, std::bind(square, _1)); 
 
    return (0); 
    } 
 
  

Требования

Заголовок: <functional>

Пространство имен: std

См. также

Ссылки

Класс is_bind_expression

Объект _1