Как параметризовать лямбду, которая используется в качестве аргумента для другой лямбды - PullRequest
0 голосов
/ 28 августа 2018
#include <iostream>

// How to parameterize this lambda and use it in the second lambda?
auto print = []() { std::cout << "in print" << std::endl; };

auto repeat = [](auto function, const int num_repeat) {
  int ctr = 0;
  while (ctr++ < num_repeat) {
    function();
  }
};

int main() {
  repeat(print, 3);
  return 0;
}

В приведенном выше примере c ++ я использовал лямбда-функцию print (которая не принимает никаких аргументов) в другой лямбде repeat в качестве аргумента. Это работает со следующим выводом:

$ ./a.out 
in print
in print
in print

Однако я хочу передать аргумент (или список переменных аргументов) в print и использовать его в repeat. Является ли это возможным? Например, модифицированный print будет выглядеть так:

auto print = [](std::string& name) { std::cout << "hello " << name << std::endl; };

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

Я не вижу проблемы?

#include <iostream>
#include <string>

// How to parameterize this lambda and use it in the second lambda?
auto print = []( const std::string& s ) { std::cout << s << std::endl; };

auto repeat = [](auto function, const int num_repeat) {
  int ctr = 0;
  while (ctr++ < num_repeat) {
    function( "call #" + std::to_string( ctr ) );
  }
};

int main() {
  repeat(print, 3);
}

Что вы пробовали, чтобы не не работало?

0 голосов
/ 28 августа 2018

Это может помочь (из cppreference )

// generic lambda, operator() is a template with two parameters
auto glambda = [](auto a, auto&& b) { return a < b; };
bool b = glambda(3, 3.14); // ok

// generic lambda, operator() is a template with one parameter
auto vglambda = [](auto printer) {
    return [=](auto&&... ts) // generic lambda, ts is a parameter pack
    { 
        printer(std::forward<decltype(ts)>(ts)...);
        return [=] { printer(ts...); }; // nullary lambda (takes no parameters)
    };
};
auto p = vglambda([](auto v1, auto v2, auto v3) { std::cout << v1 << v2 << v3; });
auto q = p(1, 'a', 3.14); // outputs 1a3.14
q();                      // outputs 1a3.14
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...