Supponiamo che io sono una funzione che prende due argomenti,Perché gli oggetti restituiti da bind ignorano gli argomenti extra?
void f(int x, int y);
e voglio legare uno di loro. Posso usare std::bind
come segue:
auto partiallyBoundF = std::bind(f, 10, _1);
partiallyBoundF
richiede un solo argomento, ma posso chiamarla con più di una. Gli argomenti oltre il primo, non hanno nemmeno bisogno di essere di un tipo che ha un senso:
partiallyBoundF(20, 0);
partiallyBoundF(0, 44, -99, "Hello", 4.5, true, []{});
Qual è lo scopo di oggetti che permettono tornato da bind
da passare argomenti extra? Permette di compilare errori di chiamata che verrebbero respinti altrove.
Che compilatore? Direi che questo potrebbe essere solo un compilatore non conforme (perché consentire quegli argomenti aggiuntivi non ha alcun senso e dubito che lo standard lo consenta). Ad esempio, MSVC emula i modelli variadici semplicemente definendo ogni modello variadic per prendere il massimo degli argomenti del modello e impostandoli per default ad alcuni tipi NIL. Forse qualcosa del genere è la causa del tuo comportamento? –
@ChristianRau: fa parte dello standard. Anche questo faceva parte del TR1. 20.8.2/4 rende il commento che l'implementazione prevista è per un operatore() 'variadic-templatized per prendere semplicemente tutto ciò che gli viene passato, indipendentemente dal tipo o dal numero di argomenti. TR1 ha una formulazione simile. – KnowItAllWannabe
Nel tuo caso, f (w1, ..., wN) dove 'N = sizeof ... (bound_args)' (numero di argomenti da associare alla chiamata) deve essere un'espressione valida, vedi 20.8.9.1.2/2 e 20.8.2/1. Modifica: NON disattiva alcun altro modo per chiamarlo. – dyp