提升lambda集合大小评估

时间:2009-03-23 06:45:11

标签: c++ functor boost-lambda boost-functional

我有以下形式的功能:

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

此函数执行某些操作,仅在条件为真时返回。该条件已表示为仿函数参数,因为我想在不同的呼叫站点提供不同的条件。

现在,直接使用它是相当简单的,但它需要声明许多小的一次性函数或函子对象,如果可能的话我想避免使用它们。我一直在关注Boost的lambda库,以寻找可能的方法来消除这些,但我认为我缺少一些基本的东西;我无法让它做我想做的事。

目前让我感到难过的一个案例:我有一个名为std::vector的{​​{1}}集合;我所追求的条件是当该集合的data达到某个阈值时。从本质上讲,我希望我的size()仿函数在condition时返回true,否则返回false。但我一直在用lambda语法表达这个问题。

迄今为止我能够提出的最好的(至少编译,但它不起作用)是这样的:

data.size() >= threshold

在进入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); 时,大小为0 - 即使在运行过程中大小增加,对DoSomething的调用似乎总是达到0的大小。追踪它(通过Boost的内部结构有点棘手),虽然每次评估condition()时似乎都在调用greater_equal,但它似乎没有调用condition()

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

我希望尽可能接近C#等效代码流畅度:

size()

1 个答案:

答案 0 :(得分:5)

问题是,lambda函数存储data向量的副本,而不是引用。因此,在副本上调用size(),而不是您正在修改的原始对象。这可以通过将databoost::ref一起打包来解决,而boost::function<size_t ()> size = boost::bind(&std::vector<std::string>::size, boost::ref(data)); 会存储一个引用:

>=

您还可以在lambda函数的定义中使用普通std::greater_equal<>运算符而不是boost::function<bool ()> cond = (boost::bind(&std::vector<std::string>::size, boost::ref(data)) >= threshold); DoSomething(cond, other stuff); ,并将它们组合在一起:

{{1}}