Como converter um lambda para uma função std :: usando modelos

Basicamente, o que eu quero ser capaz de fazer é pegar um lambda com qualquer número de qualquer tipo de parâmetro e convertê-lo em uma função std ::. Eu tentei o seguinte e nenhum método 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

O código a seguir funciona, no entanto, mas não é o que eu quero porque requer explicitamente declarar os parâmetros do modelo que não funcionam para código genérico.

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

Eu tenho andado por aí com funções e modelos durante toda a noite e eu não consigo entender isso, então qualquer ajuda seria muito apreciada.

Como mencionado em um comentário, a razão pela qual estou tentando fazer isso é porque estou tentando implementar o curry em C ++ usando modelos variadic. Infelizmente, isso falha horrivelmente ao usar lambdas. Por exemplo, posso passar uma função padrão usando um ponteiro de função.

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

No entanto, não consigo descobrir como passar um lambda para essa função variadica. Por que eu estou interessado em converter um lambda genérico em um std :: function é porque eu posso fazer o seguinte, mas ele acaba exigindo que eu explicitamente declare os parâmetros do template para std :: function, que é o que eu estou tentando evitar.

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

questionAnswers(7)

yourAnswerToTheQuestion