多次调用lambda表达式

Sin*_*all 8 c++ lambda c++11

我正在尝试新标准的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
}
Run Code Online (Sandbox Code Playgroud)

很明显我可能需要多次使用它,所以答案"只是在那里定义它"不起作用:P所以,我如何在代码中稍后调用这个lambda表达式?我是否必须创建一个函数指针并使用该指针?还是有更好/更简单的方法?

jua*_*nza 20

您可以使用lambda存储lambda auto,或者将其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);
Run Code Online (Sandbox Code Playgroud)

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

std::function<float(int,int)> f3 = f1;
Run Code Online (Sandbox Code Playgroud)

  • 你的答案似乎暗示(也许不是故意的),第二种形式(使用`auto`)只是第一种形式的简写(使用`std :: function`).应该澄清它们不一样,第二种形式更好不仅仅是因为它不那么冗长,而是因为它没有带来(在这种情况下)`std :: function`带来的不必要的开销类型擦除. (7认同)

For*_*veR 17

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;
Run Code Online (Sandbox Code Playgroud)