【问题标题】:Declaring an auto lambda function inside a class在类中声明一个自动 lambda 函数
【发布时间】: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。
  • 只是一个成员函数。为什么需要以这种方式声明成员函数?而且您正在按价值捕获成员。

标签: c++ class lambda stl


【解决方案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]];
            } } {}
    };
    

    【讨论】:

    • 要么使用初始化列表,要么使用默认(就地)成员初始化器。
    猜你喜欢
    • 2021-12-20
    • 1970-01-01
    • 2011-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-05
    • 1970-01-01
    • 2017-03-11
    相关资源
    最近更新 更多