如何将通用Lambda传递给函数

时间:2019-05-12 09:47:20

标签: c++ templates lambda c++14 generic-lambda

我有以下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 个答案:

答案 0 :(得分:5)

我不明白问题所在。

这是通用 lambda。

基本上是其中带有模板 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;});
 }

答案 1 :(得分:2)

您可以提供一个超载:

#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次。

Live