Una función llamada test
toma std :: function <> como su parámetro.C++ 11 variad std :: function parámetro
template<typename R, typename ...A>
void test(std::function<R(A...)> f)
{
// ...
}
Pero, si hago lo siguiente:
void foo(int n) { /* ... */ }
// ...
test(foo);
compilador (gcc 4.6.1) dice no matching function for call to test(void (&)(int))
.
Para hacer que la última línea test(foo)
compile y funcione correctamente, ¿cómo puedo modificar la función test()
? En la función test()
, necesito f
con el tipo de std :: función <>.
Es decir, ¿hay algún truco de plantilla para que el compilador determine la firma de la función (foo
en el ejemplo), y la convierta a std::function<void(int)>
automáticamente?
EDITAR
quiero hacer este trabajo para lambdas (ambos declarados y sin estado) también.
¿Qué hay de lambdas (ambos declararon y sin estado)? –
@Daniel estás de suerte. O haga 'test' una plantilla que acepte cualquier cosa (' T'). 'std :: function' no rechazará los objetos de función incompatibles directamente de todos modos, por lo que el objetivo de limitar el tipo del parámetro de plantilla de función no parece ser demasiado útil para mí aquí. –
He intentado con '(T)', pero, ¿cómo se puede hacer para 'std :: function'? Parece que puedo obtener 'R' usando' std :: result_of <> ', pero' A ... '? –