将lambda放在类定义中的干净方法

在本地函数中,我有运行良好的代码:

struct Divider
{
public:
    size_t factor;
    size_t next;
};

void foo()
{
    auto cmp = [](const Divider& x,const Divider& y) { return x.next > y.next; };
    std::priority_queue < Divider,std::vector<Divider>,decltype(cmp)> sieve(cmp);
    // ...
}

我现在想将我的sieve变量移到一个类中。我可以写以下怪物:

class Bar
{
    inline static auto cmp = [](const Divider& x,decltype(cmp)> sieve = std::priority_queue < Divider,decltype(cmp)>(cmp);
};

有什么方法可以编写这种默认构造而无需两次指定类型?或者只是以一种更清洁的方式。

luchangshuai1989 回答:将lambda放在类定义中的干净方法

  

有什么办法可以编写这种默认构造而无需   两次指定类型?

,可以!

使用braced-init-list(或统一初始化)来初始化std::priority_queue类的Bar成员。

class Bar
{
    inline static auto cmp
        = [](const Divider& x,const Divider& y) { return x.next > y.next; };
    std::priority_queue<Divider,std::vector<Divider>,decltype(cmp)> sieve{ cmp };
           //                                                          ^^^^^^^^^^^^^ >> like this
};

或者只是提供一个compare functor,通过它您可以避免将比较器对象传递给std::priority_queue的构造函数。

class Bar
{
    struct Compare final // compare functor
    {
        bool operator()(const Divider& x,const Divider& y) const { 
            return x.next > y.next;
        }
    };
    std::priority_queue<Divider,Compare> sieve;
    //                                                 ^^^^^^^^^^^^^^^^^ >> like this
};
,

为了完整起见,并提供一个从字面上回答问题的答案,您可以让成员函数返回lambda:

#include <iostream>

struct Bar {
    auto get_compare(){
        return [](){ std::cout << "hello world";};
    }
};

int main(){
    Bar b;
    b.get_compare()();
}

当lambda不能为静态时,我会使用它。但是,对于您发布的代码,我肯定希望使用lambda作为静态成员的解决方案,并通过使用统一的初始化(如其他答案所述)来反代码化代码。

本文链接:https://www.f2er.com/3157366.html

大家都在问