【问题标题】:Is there any reason to wrap a Lambda in a named function?是否有任何理由将 Lambda 包装在命名函数中?
【发布时间】:2020-11-28 22:33:49
【问题描述】:

我最近偶然发现了这个示例代码,我很困惑:

auto named_funct(const MyClass& some_class)
{
    return [some_class](const MyClass2& some_other_class)
    {
        return some_class <= some_other_class; // some expression between capture and input parameter to the Lambda
    };
}

是否有任何理由将匿名函数包装在命名函数中?似乎无缘无故地创建了一个额外的函数调用堆栈。

【问题讨论】:

    标签: c++ function c++11 lambda


    【解决方案1】:

    named_funct 不执行 lambda,而是返回它。你可以这样使用它:

    auto it = std::find_if(std::begin(some_vector), std::end(some_vector),
                           named_funct(some_instance));
    

    奇怪的是,named_funct 接受了一个不会做任何事情的参数,除非您遇到复制/粘贴错误(另一个实例被传递给实际的 lambda)。这个例子也很简单,我看不到 lambda 的好处,但如果 named_funct 的参数被捕获并以某种方式使用,这是一个有用的模式。

    【讨论】:

    • 非常感谢。我应该将函数的输入参数传递给捕获而不是 some_global。我编辑了我的问题,所以现在有意义了。
    【解决方案2】:

    可能是有原因的(例如,如果您想要部分函数(执行 f(x)(y) 而不是 f(x, y))的能力),但这里没有。外部输入参数被匿名函数的参数所遮蔽。

    【讨论】:

      【解决方案3】:

      要为此模式添加另一个可能(稍作修改)的用例: 即使基于模板化特征(如following example)使用不同的返回类型,您也可以返回不同的 lambda 实现。

      #include <iostream>
      #include <string>
      
      enum class MyTrait
      {
          Default,
          Other
      };
      
      struct Foo
      {
        std::string Baz() const { return "bar"; };
        int Bazz() const { return 42; };
      };
      
      template <MyTrait>
      struct LambdaGenerator;
      
      template <>
      struct LambdaGenerator<MyTrait::Default>
      {
          auto operator()(const Foo& foo) const { return [&]{ return foo.Baz(); }; }
      };
      
      template <>
      struct LambdaGenerator<MyTrait::Other>
      {
          auto operator()(const Foo& foo) const { return [&]{ return foo.Bazz(); }; }
      };
      
      
      int main()
      {
          std::cout << LambdaGenerator<MyTrait::Default>()(Foo())() << std::endl;
          std::cout << LambdaGenerator<MyTrait::Other>()(Foo())() << std::endl;
      
          // prints
          // bar
          // 42
      }
      

      在使用 C++ AMP 实现不同的 GPU 目标算法变体(在 AMP 中是 lambda 对象)时,我经常使用它。

      【讨论】:

        猜你喜欢
        • 2011-01-09
        • 1970-01-01
        • 1970-01-01
        • 2023-03-30
        • 2018-02-19
        • 1970-01-01
        • 2016-08-09
        • 1970-01-01
        • 2020-05-17
        相关资源
        最近更新 更多