Подтвердить что ты не робот

С++ 0x: правильный способ получения lambda в качестве параметра по ссылке

Каков правильный способ определения функции, которая получает параметр int->int лямбда по ссылке?

void f(std::function< int(int) >& lambda);

или

void f(auto& lambda);

Я не уверен, что последняя форма - это даже юридический синтаксис.

Существуют ли другие способы определения параметра лямбда?

4b9b3361

Ответ 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