将 lambda 放入 class 定义中的简洁方法
Clean way to put lambda in class definition
我的代码在本地函数中运行良好:
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。我可以写下下面的怪物:
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);
};
有什么方法可以在不指定类型的情况下编写这个默认构造?或者只是以更清洁的方式。
Is there any way I can write this default construction without
specifying the type twice?
可以,可以!
使用braced-init-list(或uniform-initiation)初始化Bar
的std::priority_queue
成员class。
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, std::vector<Divider>, Compare> sieve;
// ^^^^^^^^^^^^^^^^^ >> like this
};
为了完整起见并提供一个从字面上理解标题中问题的答案,您可以让成员函数 return lambda:
#include <iostream>
struct Bar {
auto get_compare(){
return [](){ std::cout << "hello world";};
}
};
int main(){
Bar b;
b.get_compare()();
}
当 lambda 不能为静态时,我会使用它。不过,对于您发布的代码,我肯定更喜欢使用 lambda 作为静态成员的解决方案,并且 de-monstrositizing 使用统一初始化的代码(如其他答案中所述)。
我的代码在本地函数中运行良好:
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。我可以写下下面的怪物:
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);
};
有什么方法可以在不指定类型的情况下编写这个默认构造?或者只是以更清洁的方式。
Is there any way I can write this default construction without specifying the type twice?
可以,可以!
使用braced-init-list(或uniform-initiation)初始化Bar
的std::priority_queue
成员class。
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, std::vector<Divider>, Compare> sieve;
// ^^^^^^^^^^^^^^^^^ >> like this
};
为了完整起见并提供一个从字面上理解标题中问题的答案,您可以让成员函数 return lambda:
#include <iostream>
struct Bar {
auto get_compare(){
return [](){ std::cout << "hello world";};
}
};
int main(){
Bar b;
b.get_compare()();
}
当 lambda 不能为静态时,我会使用它。不过,对于您发布的代码,我肯定更喜欢使用 lambda 作为静态成员的解决方案,并且 de-monstrositizing 使用统一初始化的代码(如其他答案中所述)。