Função bind
Associa argumentos a um objeto acessível.
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);
Parâmetros
Fty
O tipo do objeto na chamada.TN
O tipo de argumento enésima de chamada.fn
O objeto a ser chamado.tN
O Nth argumento de chamada.
Comentários
Os tipos Fty, T1, T2, ..., TN devem ser cópia construtível, e INVOKE(fn, t1, ..., tN) deve ser uma expressão válida para alguns valores w1, w2, ..., wN.
A primeira função do modelo retorna um wrapper g de chamada de transmissão com um tipo fraco do resultado. O efeito de g(u1, u2, ..., uM) é INVOKE(f, v1, v2, ..., vN, Classe result_of<Fty cv (V1, V2, ..., VN)>::type), onde cv é CV- os qualificadores de g e os valores e os tipos dos argumentos associados v1, v2, ..., vN são determinados como especificado em. Você usa para associar argumentos a um objeto acessível para fazer um objeto acessível com uma lista de argumento personalizado.
A segunda função do modelo retorna um wrapper g de chamada de transmissão com um tipo aninhado result_type que é um sinônimo para Ret. O efeito de g(u1, u2, ..., uM) é INVOKE(f, v1, v2, ..., vN, Ret), onde cv é CV- os qualificadores de g e os valores e os tipos dos argumentos associados v1, v2, ..., vN são determinados como especificado em. Você usa para associar argumentos a um objeto acessível para fazer um objeto acessível com uma lista de argumento personalizado e com um tipo de retorno especificado.
Os valores dos argumentos associados v1, v2, ..., vN e seus tipos correspondentes V1, V2, ..., VN dependem do tipo de argumento correspondente ti do tipo Ti na chamada de bind e em CV- qualificadores cv de wrapper g de chamada como segue:
se ti é do tipo reference_wrapper<T> o argumento vi é ti.get() e seu tipo Vi é T&;
se o valor de std::is_bind_expression<Ti>::value é true o argumento vi é ti(u1, u2, ..., uM) e seu tipo Vi é result_of<Ti cv (U1&, U2&, ..., UN&>::type;
se o valor j de std::is_placeholder<Ti>::value não é zero o argumento vi é uj e seu tipo Vi é Uj&;
se o argumento não vi é ti e seu tipo Vi é Ti cv &.
Por exemplo, em uma função f(int, int) a expressão bind(f, _1, 0) retorna um wrapper cw de chamada de transmissão de modo que cw(x) chama f(x, 0). A expressão bind(f, 0, _1) retorna um wrapper cw de chamada de transmissão de modo que cw(x) chama f(0, x).
O número de argumentos em uma chamada para bind além do argumento fn deve ser igual ao número de casos que podem ser passados para o objeto acessível fn. Assim, bind(cos, 1.0) estiver correto, e bind(cos) e bind(cos, _1, 0.0) estão incorretos.
O número de argumentos na chamada de função para o wrapper de chamada retornado por bind deve ser pelo menos tão grande quanto o valor mais alto numerado de is_placeholder<PH>::value para todos os argumentos de espaço reservado na chamada de bind. Assim, bind(cos, _2)(0.0, 1.0) está correto (e retorna cos(1.0)), e bind(cos, _2)(0.0) está incorreto.
Exemplo
// 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);
}
Requisitos
Cabeçalho: <funcional>
Namespace: std