Как правильно определить функцию, которая получает int->int
параметр лямбда по ссылке?
void f(std::function< int(int) >& lambda);
или же
void f(auto& lambda);
Я не уверен, что последняя форма является допустимым синтаксисом.
Есть ли другие способы определения лямбда-параметра?
const&
?Ответы:
У вас не может быть
auto
параметра. В основном у вас есть два варианта:Вариант №1: Используйте,
std::function
как вы показали.Вариант №2: Используйте параметр шаблона:
template<typename F> void f(F &lambda) { /* ... */}
Вариант №2 в некоторых случаях может быть более эффективным, поскольку он позволяет избежать потенциального выделения кучи для встроенного объекта лямбда-функции, но он возможен только в том случае, если
f
его можно поместить в заголовок как функцию шаблона. Это также может увеличить время компиляции и объем I-cache, как и любой шаблон. Обратите внимание, что это также может не иметь никакого эффекта, поскольку, если объект лямбда-функции достаточно мал, он может быть представлен встроенным вstd::function
объект.источник
std::function
сначала переходить через универсальную оболочку)std::function
объект» , вводит в заблуждение. Лямбды всегда доступны для встраивания (компилятор, конечно, может этого не делать).std::function
реализации обычно используют оптимизацию малых объектов, чтобы избежать выделения кучи. Если лямбда-выражение имеет достаточно маленький список захвата, он будет сохраненstd::function
без использования кучи. В остальном размер лямбды не имеет реального значения.&
вvoid f(F & lambda)
?Я бы использовал
template
как:template<typename Functor> void f(Functor functor) { cout << functor(10) << endl; } int g(int x) { return x * x; } int main() { auto lambda = [] (int x) { cout << x * 50 << endl; return x * 100; }; f(lambda); //pass lambda f(g); //pass function }
Вывод:
500 1000 100
Демо: http://www.ideone.com/EayVq
источник
Я знаю, что прошло 7 лет, но вот способ, о котором больше никто не упоминал:
void foo(void (*f)(int)){ std::cout<<"foo"<<std::endl; f(1); // calls lambda which takes an int and returns void } int main(){ foo([](int a){std::cout<<"lambda "<<a<<std::endl;}); }
Какие выходы:
foo lambda 1
Нет необходимости в шаблонах или std :: function
источник
std::function
case), в то время как шаблонная версия не имеет этого ограничения.Это близко. Фактически будет компилироваться:
#include <cassert> /*constexpr optional*/ const auto f = [](auto &&lambda) { lambda(); lambda(); }; int main() { int counter = 0; f([&]{ ++counter; }); assert(counter == 2); }
источник