2013-02-10 6 views
11

Ho una funzione membro con diversi argomenti. Mi piacerebbe associarlo a un'istanza di oggetto specifica e passare a un'altra funzione. Posso farlo con i segnaposto:Modo corto per std :: associare la funzione membro all'istanza dell'oggetto senza parametri di associazione

// actualInstance is a MyClass* 
auto callback = bind(&MyClass::myFunction, actualInstance, _1, _2, _3); 

Ma questo è un po 'goffo - per uno, quando il numero di parametri modifiche, devo cambiare tutto il bind chiama pure. Ma in aggiunta, è abbastanza noioso digitare tutti i segnaposto, quando tutto ciò che voglio veramente è creare un "puntatore di funzione" che includa un riferimento a un oggetto.

Allora, cosa mi piacerebbe essere in grado di fare è qualcosa di simile:

auto callback = objectBind(&MyClass::myFunction, actualInstance); 

Qualcuno sa qualche bel modo per fare questo?

+0

C'è stato un suggerimento per consentire qualcosa di simile a 'bind (& MyClass :: myFunction, actualInstance, std :: :: segnaposti tutti)' per fare questo –

+0

Ok - sapete perché non è stato incluso nello standard? –

+0

Perché è stato proposto solo il mese scorso, quindi nessuno lo ha implementato, per non dire proposto per lo standard ancora –

risposta

11

penso che questo funzionerà:

template<typename R, typename C, typename... Args> 
std::function<R(Args...)> objectBind(R (C::* func)(Args...), C& instance) { 
    return [=](Args... args){ return (instance.*func)(args...); }; 
} 

poi:

auto callback = objectBind(&MyClass::myFunction, actualInstance); 

nota: è necessario sovraccarichi per gestire le funzioni di membro CV-qualificati. vale a dire:

template<typename R, typename C, typename... Args> 
std::function<R(Args...)> objectBind(R (C::* func)(Args...) const, C const& instance) { 
    return [=](Args... args){ return (instance.*func)(args...); }; 
} 
+1

Questo presuppone che 'myFunction' non sia qualificato in cv, quindi dovrebbe essere modificato se è –

+0

Qualsiasi ragione particolare che hai preso l'indirizzo e ha fatto '(& istanza) -> * func' invece di' instance. * func'? – 0x499602D2

+0

@JonathanWakely c'è un modo migliore per farlo, oltre ad aggiungere un sacco di sovraccarichi? – Pubby