【问题标题】:Calling a lambda expression multiple times多次调用 lambda 表达式
【发布时间】:2013-07-14 16:01:55
【问题描述】:

我正在尝试新标准中的 lambda 表达式,但仍然不太了解它们。

假设我的代码中有一个 lambda,例如在我的主要:

int main( int argc, char * argv[])
{
    //some code
    [](int x, int y)->float
    {
        return static_cast<float>(x) / static_cast<float>(y);
    };
    //some more code here
    //<---now I want to use my lambda-expression here
}

很明显我可能需要多次使用它,所以“就在那儿定义它”的答案是行不通的:P 那么,我如何在后面的代码中调用这个 lambda 表达式呢?我是否必须创建一个指向它的函数指针并使用该指针?还是有更好/更简单的方法?

【问题讨论】:

    标签: c++ c++11 lambda


    【解决方案1】:

    您可以使用 auto 存储 lambda,或将其显式分配给兼容的 std::function

    auto f1 = [](int x, int y)->float{ ..... };
    std::function<float(int,int)> f2 = [](int x, int y)->float{ ..... };
    
    float x = f1(3,4);
    auto y = f2(5,6);
    

    如有必要,您可以随时使用f1f2 构造或分配给特定的std::function 类型:

    std::function<float(int,int)> f3 = f1;
    

    【讨论】:

    • 您的回答似乎暗示(也许不是故意),第二种形式(使用auto)只是第一种形式(使用std::function)的简写。应该澄清的是,它们并不相同,第二种形式更好,不仅因为它不那么冗长,而且因为它没有(在这种情况下)std::function 因类型擦除而带来的不必要的开销。
    • @BenjaminLindley 实际上暗示是故意的,尽管我意识到这可能是错误的。我认为auto 必须解析为一个类型,我认为在这种情况下它将是一个std::function。如果你能对此有所了解,我会相应地修正我的答案。
    • 哦,对了。 auto 解析为一个类型当然是真的。但在这种情况下,该类型是不可命名的。编译器将有一个它在内部使用的名称,如果您错误地使用了 lambda,您可能会看到它。例如,如果 lambda 在 main 中声明,GCC 会给它一个类似 main()::&lt;lambda(int,int)&gt; 的名称。主要区别在于 std::function 是一个变量,它可以保存任何具有适当签名的函数、函数对象或 lambda。而 lambda 变量只能保存一种类型,即 lambda 本身。
    • @BenjaminLindley 好的,我不知何故对这个问题感到困惑。谢谢你的解释。
    【解决方案2】:
    auto lambda = [](int x, int y)->float
        {
            return static_cast<float>(x) / static_cast<float>(y);
        };
    // code
    // call lambda
    std::cout << lambda(1, 2) << std::endl;
    

    【讨论】:

      猜你喜欢
      • 2018-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多