Una funzione denominata test
assume come parametro lo std :: function <>.C++ 11 variadic std :: parametro funzione
template<typename R, typename ...A>
void test(std::function<R(A...)> f)
{
// ...
}
Ma, se faccio la seguente:
void foo(int n) { /* ... */ }
// ...
test(foo);
Compiler (GCC 4.6.1) dice no matching function for call to test(void (&)(int))
.
Per rendere l'ultima riga test(foo)
compila e funziona correttamente, come posso modificare la funzione test()
? Nella funzione test()
, ho bisogno di f
con tipo di std :: function <>.
Voglio dire, c'è qualche trucco del template per consentire al compilatore di determinare la firma della funzione (foo
nell'esempio) e convertirlo automaticamente in std::function<void(int)>
?
EDIT
voglio fare questo lavoro per lambda (sia dichiarato e apolidi) pure.
Che dire lambda (sia dichiarato e apolidi)? –
@Daniel sei sfortunato. Oppure fai 'test' un modello che accetta qualsiasi cosa (' T'). 'std :: function' non rifiuterà comunque gli oggetti funzione incompatibili, quindi l'obiettivo di limitare il tipo del parametro del template funzione sembra non essere troppo utile per me qui. –
Ho provato con '(T)', ma come può essere fatto a 'std :: function'? Sembra che io possa ottenere 'R' usando' std :: result_of <> ', ma' A ... '? –