【问题标题】:How to pass generic lambda into function如何将通用 lambda 传递给函数
【发布时间】:2019-05-12 09:47:19
【问题描述】:

我有以下 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 次?我认为模板模板参数可能会有所帮助,但我无法理解它们。

【问题讨论】:

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


    【解决方案1】:

    我不明白这个问题。

    这是一个通用 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;});
     }
    

    【讨论】:

    • “带有模板 operator() 的结构” - 谢谢,现在我明白了。我真的应该学一次 C++ :D
    • @Bulat 见cppinsights.io/…
    • @JVApen 非常感谢您!看起来这个网站可以在很多情况下帮助我
    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-10
      • 2022-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-13
      相关资源
      最近更新 更多