gpt4 book ai didi

c++ - 提升 lambda 集合大小评估

转载 作者:太空狗 更新时间:2023-10-29 20:49:23 27 4
gpt4 key购买 nike

我有一个函数的形式:

void DoSomething(const boost::function<bool ()>& condition, other stuff);

这个函数做一些工作,只有当条件为真时才返回。条件已表示为仿函数参数,因为我想在不同的调用点提供不同的条件。

现在,直接使用它相当简单,但它需要声明大量一次性函数或仿函数对象,我希望尽可能避免。我一直在查看 Boost 的 lambda 库,寻找消除这些问题的可能方法,但我认为我遗漏了一些基本的东西;我就是无法让它做我想做的事。

目前让我感到困惑的一个案例是:我有一个名为 datastd::vector 集合;我所追求的条件是该集合的 size() 达到某个阈值时。那么,本质上,我希望我的 condition 仿函数在 data.size() >= threshold 时返回 true,否则返回 false。但我一直无法用 lambda 语法表达它。

到目前为止,我能想到的最好的(至少可以编译,尽管它不起作用)是这样的:

boost::function<bool (size_t)> ge = boost::bind(std::greater_equal<size_t>(),
_1, threshold);
boost::function<size_t ()> size = boost::bind(&std::vector<std::string>::size,
data);
DoSomething(boost::lambda::bind(ge, boost::lambda::bind(size)), other stuff);

DoSomething 入口处,大小为 0——即使在运行过程中大小增加,对 condition() 的调用似乎总是大小为 0。跟踪它(通过 Boost 的内部机制有点棘手),虽然每次评估 condition() 时它确实调用 greater_equal,它似乎没有调用 size()

那么我完全搞砸了什么基本的东西?有没有一种更简单的方式来表达这种事情(同时仍尽可能保持代码内联)?

理想情况下,我希望它尽可能接近 C# 等效代码流畅度:

DoSomething(delegate() { return data.size() >= threshold; }, other stuff);
DoSomething(() => (data.size() >= threshold), other stuff);

最佳答案

问题是,lambda 函数存储了 data 的拷贝 vector ,不是引用。所以size()在拷贝上调用,而不是在您正在修改的原始对象上调用。这可以通过包装 data 来解决与 boost::ref ,它存储一个引用:

boost::function<size_t ()> size = boost::bind(&std::vector<std::string>::size,
boost::ref(data));

您也可以使用普通的 >=运算符而不是 std::greater_equal<>在您的 lambda 函数的定义中并将它们组合在一起:

boost::function<bool ()> cond =
(boost::bind(&std::vector<std::string>::size, boost::ref(data))
>= threshold);

DoSomething(cond, other stuff);

关于c++ - 提升 lambda 集合大小评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/672421/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com