В принципе, то, что я хочу сделать, это взять лямбда с любым количеством параметров любого типа и преобразовать его в std:: function. Я пробовал следующее, и ни один из методов не работает.
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
Следующий код действительно работает, но это не то, что я хочу, потому что он требует явно указывать параметры шаблона, которые не работают для общего кода.
std::function<void()>([](){});
Я весь день торчал с функциями и шаблонами, и я просто не могу понять это, поэтому любая помощь будет очень оценена.
Как упоминалось в комментарии, причина, по которой я пытаюсь это сделать, - это то, что я пытаюсь реализовать currying на С++ с использованием вариативных шаблонов. К сожалению, это не удается с помощью лямбда. Например, я могу передать стандартную функцию с помощью указателя функции.
template <typename R, typename...A>
void foo(R (*f)(A...)) {}
void bar() {}
int main() {
foo(bar);
}
Однако я не могу понять, как передать лямбду такой вариационной функции. Почему я заинтересован в преобразовании общей лямбды в функцию std::, потому что я могу сделать следующее, но в конечном итоге это требует, чтобы я явно указывал параметры шаблона в std:: function, чего я пытаюсь избежать.
template <typename R, typename...A>
void foo(std::function<R(A...)>) {}
int main() {
foo(std::function<void()>([](){}));
}