bind Function
Привязывает аргументы могут вызываться объекту.
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
Тип Nth аргументов вызова.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 Class<Ftycv(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<Ticv(U1&, U2&, ..., UN&>::type;
если значение jstd::is_placeholder<Ti>::value не равно нулю, то аргумент viuj и его тип ViUj&;
в противном случае аргумент viti и его тип ViTicv&.
Например, для функции 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 пространство имен: