Se tutto quello che vogliamo fare è chiamare una funzione arbitraria con un argomento arbitrario, questo è solo un modello su entrambi i tipi:
template <typename Function, typename Arg>
void call_with_one(Function&& f, Arg&& arg) {
f(std::forward<Arg>(arg));
}
che è possibile espandere per chiamare con qualsiasi numero di argomenti, rendendo variadic :
template <typename Function, typename... Arg>
void call_with_any(Function f, Arg&&... args) {
f(std::forward<Arg>(args)...);
}
o realmente f
dovrebbe essere un punto di riferimento di inoltro così:
template <typename Function, typename... Arg>
void call_with_any(Function&& f, Arg&&... args) {
std::forward<Function>(f)(std::forward<Arg>(args)...);
}
Si noti che questo funzionerà solo con funzioni e oggetti che implementano operator()
. Se f
è un puntatore a membro, ciò non riuscirà: sarà invece necessario utilizzare std::bind
come suggerisce Mike Seymour.
'std :: function' e' std :: bind'? –
considera segnale/slot? – user3528438
Per C++ 17, ci sarà ['std :: invoke()'] (http://en.cppreference.com/w/cpp/utility/functional/invoke), che fa esattamente questo. – DanielKO