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