Un frammento di codice che ho visto in Effective C++ moderno dispone di un'implementazione intelligente del instrumentation rationale per creare un funzione timer:Quando dovrei std :: inoltrare una chiamata di funzione?
auto timeFuncInvocation =
[](auto&& func, auto&&... params)
{
start timer;
std::forward<decltype(func)>(func)(
std::forward<decltype(params)>(params)...);
stop timer and record elapsed time;
};
La mia domanda riguarda std::forward<decltype(func)>(func)(...
- Per la mia comprensione, siamo in realtà casting la funzione al suo tipo originale, ma perché è necessario? Sembra che una semplice chiamata farebbe il trucco.
- Esistono altri casi in cui si utilizza l'inoltro perfetto per effettuare una chiamata di funzione?
Questo appare come un buon caso d'uso per the use of familiar template syntax in lambda expressions nel caso in cui abbiamo voluto fare il tipo di timer una costante di tempo di compilazione.
penso che potrebbe essere perché 'func' possibile grande oggetto funzione con un operatore non-const(). In questo modo, si evita di copie inutili e lasciate mutazione del l'oggetto funzione – KABoissonneault
Il tipo * * dell'espressione non cambia con il cast, ma la sua categoria * * valore non. Questo è l'intero e solo [punto di 'forward'] (http://stackoverflow.com/a/13219621). –
L'intento è quello di assicurarsi il corretto [ref-qualificati] (http://en.cppreference.com/w/cpp/language/member_functions#const-.2C_volatile-.2C_and_ref-qualified_member_functions) Sovraccarico di 'operatore()' è scelto –