如何解决使用lambda函数进行向量排序,如果不在同一范围内,如何传递变量以捕获组?
基本上,我有一个很大的lambda函数,用于对自定义对象的向量进行排序。唯一的问题是lambda函数依赖于通过捕获组传递给它的对象。这已经工作了一段时间,但是现在我想在程序的不同部分中重用相同的功能。这是我的代码:
void fun(int i) {
...
BarMovement movement(i);
auto sortByBarMovement = [movement](OrderLogic::OpenOrder const& order1,OrderLogic::OpenOrder const& order2) -> bool
{
...
};
std::sort(std::begin(same_bar_order_fill),std::end(same_bar_order_fill),sortByBarMovement);
...
}
我想将sortByBarMovement
lambda移到它自己的函数中,以便我可以重用它。但是,它取决于捕获组中的项目movement
。
如果将movement
移动到其他范围,如何在C ++中将该sortByBarMovement
对象传递给lambda函数?
解决方法
lambda只是函子的语法糖。最大的好处是,您可以在同一范围内直接在使用Lambda的地方直接编写它。另一方面,如果要在其他地方重用它,则与普通函数对象相比,lambda没有太大优势。也许更清楚是否跳过糖:
struct sortByBarMovement_type {
BarMovement movement;
sortByBarMovement_type(const BarMovement& movement) : movement(movement) {}
bool operator()(OrderLogic::OpenOrder const& order1,OrderLogic::OpenOrder const& order2) const {
...
}
};
基本上就是您所需要的。 fun
现在看起来像这样:
void fun(int i) {
...
BarMovement movement(i);
sortByBarMovement_type sortByBarMovement{movement};
std::sort(std::begin(same_bar_order_fill),std::end(same_bar_order_fill),sortByBarMovement);
...
}
PS:我试图尽可能地接近您的代码。这就是为什么我要复制movement
的原因。也许保持引用就足够了。另外,您的λoperator()
是const
,但sortByBarMovement_type::operator()
不一定是const
。
您可以创建一个类来保留对BarMovement
的引用,并实现operator()
进行比较:
struct sortByBarMovement {
sortByBarMovement(const BarMovement& bm) : bmref(bm) {}
bool operator()(const OrderLogic::OpenOrder& order1,const OrderLogic::OpenOrder& order2) const
{
// logic ...
return <result>;
}
const BarMovement& bmref;
};
std::sort(std::begin(same_bar_order_fill),sortByBarMovement(movement));
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。