在类中声明一个自动 lambda 函数

Posted

技术标签:

【中文标题】在类中声明一个自动 lambda 函数【英文标题】:Declaring an auto lambda function inside a class 【发布时间】:2020-05-18 19:25:30 【问题描述】:

我正在尝试在一个类中声明一个 lambda 比较函数:

class Solve 
private:
    int n, q, first[N+1], depth[N+1], seg[_log(N)+2][(N<<1)+1];
    vector <int> G[N+1], euler;

    auto cmp = [euler, depth] (const int &a, const int &b) -> bool 
        return depth[euler[a]] < depth[euler[b]];
    ;
...

但得到错误:error: non-static data member declared with placeholder 'auto'

将函数声明为静态无济于事:error: capture of non-variable 'Solve::euler' + 一堆其他错误。 显式使用 std::function 也没有解决它。

该函数旨在用于min(a, b, cmp);

非常感谢任何帮助!

【问题讨论】:

您能否发布一个不依赖于编译器扩展的minimal reproducible example,以便我复制/粘贴并使用我的 SO(偏执)设置进行编译? 当然:pastebin.com/RxRiyy4d 如果您要获取整个代码,就是这样,但其中很多很可能是无用的:pastebin.com/CV1RJPLi 我的编译器选项是 -Wall -O2 -std =c++11。除此之外,没有进行任何更改。谢谢! 我认为使用 auto 需要用 c++14 编译的函数。 您不能将临时函数对象放在类定义中。这与 lambda 的意义相矛盾。您可以改用生成器方法,它返回一个 lambda。 只是一个成员函数。为什么需要以这种方式声明成员函数?而且您正在按价值捕获成员。 【参考方案1】:

没有必要在你的类中存储 lambda。您可以在需要时构建一个。

我会为此创建一个方法:

auto MakeComparator() const

    return [this](const int &a, const int &b) -> bool
    
        return depth[euler[a]] < depth[euler[b]];
    ;
;

【讨论】:

【参考方案2】:

您不能在类定义中创建 lambda 函数。将其移至构造函数(auto 在编译时确定,在这里不起作用):

class Solve 
    ...
    std::function<bool(int, int)> cmp;
public:
    Solve() :
        cmp [&euler = this->euler, &depth = this->depth] (const int& a, const int& b) -> bool 
            return depth[euler[a]] < depth[euler[b]];
          
;

【讨论】:

要么使用初始化列表,要么使用默认(就地)成员初始化器。

以上是关于在类中声明一个自动 lambda 函数的主要内容,如果未能解决你的问题,请参考以下文章

继承20161223

内联函数

c++中的内联函数inline

qt 键盘事件

使用“接口”时在类中没有声明成员函数

在类中声明 Alamofire.SessionManager 一次,以便在类内的各种实用程序函数中使用它