С++ 0x: правильный способ получения lambda в качестве параметра по ссылке
Каков правильный способ определения функции, которая получает параметр int->int
лямбда по ссылке?
void f(std::function< int(int) >& lambda);
или
void f(auto& lambda);
Я не уверен, что последняя форма - это даже юридический синтаксис.
Существуют ли другие способы определения параметра лямбда?
Ответы
Ответ 1
У вас не может быть параметра auto
. У вас в основном есть два варианта:
Вариант №1: используйте std::function
, как вы показали.
Вариант № 2: используйте параметр шаблона:
template<typename F>
void f(F &lambda) { /* ... */}
Вариант № 2 может в некоторых случаях быть более эффективным, так как он может избежать потенциального распределения кучи для встроенного объекта функции лямбда, но возможен только в том случае, если f
можно поместить в заголовок как функцию шаблона. Это может также увеличить время компиляции и размер I-кеша, как и любой шаблон. Обратите внимание, что он также может не иметь эффекта, как если бы объект лямбда-функции был достаточно мал, он может быть представлен inline в объекте std::function
.
Ответ 2
Я использовал бы 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
Ответ 3
Я знаю, что на этот вопрос уже был дан ответ, но когда я искал ответ на этот вопрос, я искал что-то немного отличающееся от ответов здесь, и я думаю, что это, возможно, было то, что OP намекал на, поэтому здесь надеемся, что это поможет кому-то другому.
Скажите, что у вас есть функция:
void print(int n)
{
printf("%i ", n);
}
Чтобы передать лямбда этой функции, вы делаете следующее:
print([]{
return 3;
}());
Это, очевидно, приведет к функции 3. Более полезным примером, конкретно связанным с вопросом OP, является лямбда, которая принимает целое число в качестве параметра и возвращает функцию int в конечную функцию:
int x = 3;
auto lambdaFunction = [](int input) {
return (input + 1);
};
print(lambdaFunction(x));
Предполагается, что вы не проходите по значению или по ссылке на лямбда, которую вы можете сделать напрямую:
// Pass by value
print([=]{
return (x + 1);
}());
// Pass by reference
print([&]{
return (x + 1);
}());
Ответ 4
Я знаю, что это было 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