2013-04-23 16 views
5

std :: bind ho questo codice:std :: funzione e il comportamento

#include <iostream> 
#include <functional> 
#include <vector> 

void fun() 
{ 
    std::cout<<"fun"; 
} 

void gun(int) 
{ 
    std::cout<<"gun"; 
} 

int main() 
{ 
    std::vector<std::function<void(int)>> vec; 

    vec.push_back(std::bind(fun)); 
    vec.push_back(gun); 

    vec[0](1); 
    vec[1](2); 
} 

Può spiegare come sia possibile per std::bind tornare std::function<void(int)> quando vincolante void() funzione?

Come è possibile chiamare la funzione void() utilizzando il functor void(int)?

+1

proprio come un pignolo: per favore fornisci anche tutte le istruzioni necessarie "# include" nel tuo codice (vettore, iostreams, funzionale). Rende molto più conveniente copiare e incollare. – TemplateRex

risposta

9

La firma passata come argomento modello per function determina solo quanti segnaposti (_1) verranno associati e come tipi.

L'invocazione della funzione effettiva utilizza solo il numero di argomenti effettivamente richiesti dalla funzione associata. In effetti, il parametro superfluo viene ignorato. (?)

Un altro, più illuminante esempio, guardando questo dal lato opposto:

#include <iostream> 
#include <functional> 

void gun(int i) 
{ 
    std::cout<<"gun("<<i<<")"; 
} 

int main() 
{ 
    using namespace std::placeholders; 
    std::bind(gun, _5)("ignore", 3, "and", 4, 43); 
} 

Stampe

gun(43) 
+0

Mi dispiace ma questo non risponde alla mia domanda: come std :: bind può rendere x params funzione x + k params std :: function? È chiaro come può fare da x + k params function x params std :: function. – Felics

+0

@Felici per essere perfettamente contundenti, la risposta più rigida sarebbe: "quella è l'implementazione definita" - lo standard non specifica come 'std :: function' deve essere implementato, o, per quella questione, il tipo restituito di' std: : bind'. Quindi se davvero volessi sapere ** come ** è implementato, vai alla tua implementazione. Pensavo che te lo stavi chiedendo concettualmente, e penso di averlo risposto. – sehe

+0

@Felics vedere anche [questa domanda] (http://stackoverflow.com/questions/13251976/why-do-objects-returned-from-bind-ignore-extra-arguments) – TemplateRex

0

Come è possibile chiamare void() funzione utilizzando void(int) funtore?

std::bind(fun) non restituisce una funzione void(), restituisce un wrapper chiamata di tipo non specificato.

Il modo normale di invocare tale involucro chiamata sarebbe con zero argomenti, ma nella maggior parte delle implementazioni di bind() questo tipo può essere chiamato con zero o più argomenti e gli argomenti aggiuntivi viene ignorato (cioè non passati al bersaglio funzione)

più in generale, per una funzione F prendendo N argomenti, bind(F) restituisce un involucro chiamata che può essere chiamato con N o più argomenti. Se si associano argomenti o si utilizzano segnaposti, questo modificherà il numero minimo di argomenti necessari per richiamare il call wrapper.

Problemi correlati