Как преобразовать лямбду в станд.:: шаблоны использования функции

В основном то, что я хочу смочь сделать, является взятием лямбда с любым количеством любого типа параметров, и преобразуйте его в станд.:: функция. Я попробовал следующее и никакой метод работы.

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()>([](){}));
}
62
задан 13 November 2012 в 14:22

1 ответ

В C++ 17 существует вычет типа конструктора. Таким образом, можно сохранить некоторый ввод для станд.:: аргументы шаблона функции. Это - не совсем ничто, но немного меньше.

template <typename R, typename...A>
void foo(std::function<R(A...)>) {}
int main() {
   foo(std::function([](){}));
}    
1
ответ дан 31 October 2019 в 14:14

Другие вопросы по тегам:

Похожие вопросы: