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

Jef*_*ica 4 c++ lambda class class-members c++11

我有一个在本地函数中可以正常工作的代码:

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

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

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 = std::priority_queue < Divider, std::vector<Divider>, decltype(cmp)>(cmp);
};
Run Code Online (Sandbox Code Playgroud)

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

JeJ*_*eJo 6

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

是的,可以!

使用花括号初始化列表(或统一初始化)初始化类的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
};
Run Code Online (Sandbox Code Playgroud)

或者简单地提供一个比较函子,通过它可以避免将比较器对象传递给的构造函数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, std::vector<Divider>, Compare> sieve;
    //                                                 ^^^^^^^^^^^^^^^^^ >> like this
};
Run Code Online (Sandbox Code Playgroud)