将lambda放入类定义中的干净方法
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 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);
};
有没有什么方法可以在不指定两次类型的情况下编写这个默认构造?或者只是以一种更干净的方式。
有什么方法可以在没有指定两次类型?
是,您可以!
使用braked init list(或uniform initiation(初始化Bar
类的std::priority_queue
成员。
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函子,通过它可以避免将comparator对象传递给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
};
为了完整起见,并提供一个从字面上理解标题中问题的答案,您可以让成员函数返回lambda:
#include <iostream>
struct Bar {
auto get_compare(){
return [](){ std::cout << "hello world";};
}
};
int main(){
Bar b;
b.get_compare()();
}
当lambda不能是静态的时,我会使用它。不过,对于您发布的代码,我肯定更喜欢将lambda作为静态成员并通过使用统一初始化来消除代码畸形的解决方案(如另一个答案中所述(。
相关文章:
- 在方法定义中显式指定命名空间
- 没有针对完全专用模板类的外联虚拟方法定义
- 将虚拟方法定义为私有方法时会发生什么情况?
- 单独的类声明和方法定义文件问题
- Eclipse CDT 不了解方法定义是什么
- C 方法定义具有模板
- Eclipse CDT将方法定义定义到标头文件
- 模板方法定义的问题 - 错误C2244:无法将函数定义与现有声明匹配
- 如何为 Product* getProductFromID(std::string)编写方法定义;.
- gdb 中的方法定义没有源代码
- 方法定义中的错误"passing const List<int> as this argument discards qualifiers"
- Sendmessage在方法定义内部无法正常工作
- C 公共方法定义后定义
- C++模板方法定义在类中不匹配
- 为什么通用模板方法定义与模板类专用化不匹配?
- 方法定义中的C++模板参数
- C++方法定义和变量声明
- 在继承层次结构中将方法定义为虚拟方法一次,以使多态性发挥作用
- 未为非访问器方法定义C++类属性
- 无法将一个类的方法定义为另一个类的好友