Cómo convertir una lambda a una función std :: usando plantillas

Básicamente, lo que quiero poder hacer es tomar un lambda con cualquier número de cualquier tipo de parámetros y convertirlo en una función std ::. He intentado lo siguiente y ninguno de los métodos funciona.

std::function([](){});//Complains that std::function is missing template parameters
template <typename T> void foo(function<T> f){}
foo([](){});//Complains that it cannot find a matching candidate

Sin embargo, el siguiente código funciona, pero no es lo que quiero porque requiere una declaración explícita de los parámetros de la plantilla que no funciona con el código genérico.

std::function<void()>([](){});

He estado andando por ahí con funciones y plantillas toda la noche y simplemente no puedo resolver esto, por lo que cualquier ayuda sería muy apreciada.

Como se mencionó en un comentario, la razón por la que estoy tratando de hacer esto es porque estoy tratando de implementar el curry en C ++ usando plantillas variadic. Desafortunadamente, esto falla horriblemente cuando se usan las lambdas. Por ejemplo, puedo pasar una función estándar utilizando un puntero de función.

template <typename R, typename...A>
void foo(R (*f)(A...)) {}
void bar() {}
int main() {
    foo(bar);
}

Sin embargo, no puedo averiguar cómo pasar un lambda a una función tan variada. El motivo por el que estoy interesado en convertir un lambda genérico en una función std :: es porque puedo hacer lo siguiente, pero al final me obliga a indicar explícitamente los parámetros de la plantilla a std :: function, que es lo que estoy tratando de evitar.

template <typename R, typename...A>
void foo(std::function<R(A...)>) {}
int main() {
    foo(std::function<void()>([](){}));
}

Respuestas a la pregunta(7)

Su respuesta a la pregunta