我可以在没有auto的情况下定义C++ lambda函数吗?

Jac*_*uan 9 c++ lambda

我以前有很多C#经验,但我是C++的新手.当我尝试使用lambda时,我已经看到了这个问题.

例如:

auto compare = [] (int i1, int i2) { return i1*2 > i2; }
Run Code Online (Sandbox Code Playgroud)

有没有办法用特定的类型定义lambda,而不是自动扣除?

我问这个是因为我想为我的班级定义一个普通的lambda.这个lambada将在多个地方使用,所以我不想多次定义它们.但是,'auto'只能用于静态成员,而另一方面,我想访问lambda中的非静态字段.

Bla*_*iwi 10

你使用std::function,它可以为任何lambda或函数指针.

std::function< bool(int, int) > myFunc = []( int x, int y ){ return x > y; };

请参阅C++参考.

  • @morp是什么?lambda应该在性能敏感的环境中使用:它们允许你使用非常复杂的线束来提供零开销的代码包.为什么你认为不应该使用它们? (6认同)
  • 请注意,由于动态性,`std :: function`的效率较低.通常没关系. (2认同)
  • Lambda并不慢. (2认同)

lee*_*mes 5

您可以使用std::function,但如果这不够高效,您可以编写一个函子对象,它类似于 lambda 在幕后所做的事情:

auto compare = [] (int i1, int i2) { return i1*2 > i2; }
Run Code Online (Sandbox Code Playgroud)

几乎与

struct Functor {
    bool operator()(int i1, int i2) const { return i1*2 > i2; }
};
Functor compare;
Run Code Online (Sandbox Code Playgroud)

如果函子应该捕获上下文中的某些变量(例如“this”指针),则需要在函子内添加成员并在构造函数中初始化它们:

auto foo = [this] (int i) { return this->bar(i); }
Run Code Online (Sandbox Code Playgroud)

几乎与

struct Functor {
    Object *that;
    Functor(Object *that) : that(that) {}
    void operator()(int i) const { return that->bar(i); }
};
Functor foo(this);
Run Code Online (Sandbox Code Playgroud)