Condividi tramite


Funzione bind

Associa gli argomenti a un oggetto richiamabile.

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);

Parametri

  • Fty
    Il tipo di oggetto alla chiamata.

  • TN
    Il tipo di n argomento di chiamata.

  • fn
    L'oggetto alla chiamata.

  • tN
    L'ennesimo argomento di chiamata.

Note

I tipi Fty, T1, T2, ..., TN devono essere copiati costruttibile e INVOKE(fn, t1, ..., tN) deve essere un'espressione valida per alcuni valori w1, w2, ..., wN.

La prima funzione template restituisce un wrapper di inoltro g di chiamata con un tipo di risultato debole. L'effetto di g(u1, u2, ..., uM) è INVOKE(f, v1, v2, ..., vN, Classe result_of<Fty cv (V1, V2, ..., VN)>::type), dove cv è cv- i qualificatori di g e i valori e i tipi degli argomenti associati v1, v2, ..., vN sono determinati come indicato di seguito. È possibile utilizzarlo per associare argomenti a un oggetto che può essere chiamato per consentire a un oggetto che può essere chiamato con un elenco di argomenti corrispondenti.

La seconda funzione template restituisce un wrapper di inoltro g di chiamata con un tipo annidato result_type che è sinonimo di Ret. L'effetto di g(u1, u2, ..., uM) è INVOKE(f, v1, v2, ..., vN, Ret), dove cv è cv- i qualificatori di g e i valori e i tipi degli argomenti associati v1, v2, ..., vN sono determinati come indicato di seguito. È possibile utilizzarlo per associare argomenti a un oggetto che può essere chiamato per consentire a un oggetto che può essere chiamato con un elenco di argomenti corrispondenti e con un tipo restituito specificato.

I valori degli argomenti associati v1, v2, ..., vN e i relativi tipi corrispondenti V1, V2, ..., VN dipendono dal tipo di argomento corrispondente ti di tipo Ti nella chiamata a bind e dei cv- qualificatori cv wrapper g di chiamata come segue:

se ti è di tipo reference_wrapper<T> l'argomento vi è ti.get() e il relativo tipo Vi è T&;

se il valore di std::is_bind_expression<Ti>::value è true l'argomento vi è ti(u1, u2, ..., uM) e il relativo tipo Vi è result_of<Ti cv (U1&, U2&, ..., UN&>::type;

se il valore j di std::is_placeholder<Ti>::value è diverso da zero l'argomento vi è uj e il relativo tipo Vi è Uj&;

nell'argomento vi è ti e il relativo tipo Vi è Ti cv &.

Ad esempio, specificata a una funzione f(int, int) l'espressione bind(f, _1, 0) restituisce un wrapper di inoltro cw di chiamata in modo che cw(x) chiama f(x, 0). L'espressione bind(f, 0, _1) restituisce un wrapper di inoltro cw di chiamata in modo che cw(x) chiama f(0, x).

Il numero di argomenti in una chiamata a bind oltre all'argomento fn deve essere uguale al numero di argomenti che possono essere passati all'oggetto essere chiamato fn. Pertanto, bind(cos, 1.0) è corretto e che sia bind(cos)bind(cos, _1, 0.0) sono errati.

Il numero di argomenti nella chiamata di funzione al wrapper di chiamata restituito da bind deve essere almeno grande come valore numerato superiore di is_placeholder<PH>::value per tutti gli argomenti segnaposto nella chiamata a bind. Pertanto, bind(cos, _2)(0.0, 1.0) è corretto (e restituisce cos(1.0)) e bind(cos, _2)(0.0) non è corretto.

Esempio

 

// 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); 
    } 
 
  

Requisiti

Intestazione: <funzionale>

Spazio dei nomi: std

Vedere anche

Riferimenti

Classe is_bind_expression

Oggetto _1