Как передать универсальную лямбду в функцию - PullRequest
3 голосов
/ 12 мая 2019

У меня есть следующий код C ++:

template <class T1, class T2, class T3>
void MetaTypeHandler(T1 lambda1, T2 lambda2, T3 lambda3) {
 lambda1(1);
 lambda2('x');
 lambda3(true);
}

int main() {
  auto f = [] (auto x) {};
  MetaTypeHandler(f,f,f);
}

Передача f несколько раз ужасна.Можно ли написать MetaTypeHandler(), чтобы f передавался только 1 или 2 раза?Я думаю, что параметры шаблона шаблона могут помочь, но не могу обернуть их вокруг.

Ответы [ 2 ]

5 голосов
/ 12 мая 2019

Я не понимаю проблемы.

Это универсальный лямбда.

По существу, объект структуры с шаблоном operator() в нем.

Таким образом, вы можете передать его только один раз и использовать со всеми типами, которые вам нужны

#include <iostream>

template <typename T>
void MetaTypeHandler (T lambda)
 {
   lambda(42);
   lambda('x');
   lambda("abc");
   lambda(true);
 }

int main()
 {
   MetaTypeHandler(
      [](auto const & x){ std::cout << "x is " << x << std::endl;});
 }
2 голосов
/ 12 мая 2019

Вы можете просто предоставить перегрузку:

#include <iostream>

template <class T1, class T2, class T3>
void MetaTypeHandler(T1 lambda1, T2 lambda2, T3 lambda3) {
 lambda1(1);
 lambda2('x');
 lambda3(true);
}

template <class T>
void MetaTypeHandler(T lambda)
{
    MetaTypeHandler(lambda, lambda, lambda);
}

int main() {
  auto f = [] (auto x) {std::cout << x << std::endl;};
  MetaTypeHandler(f);
}

Таким образом, вы можете передать 3 разных обработчика или один обработчик, выполняющийся 3 раза.

Живите

...