我有一个形式的功能:
void DoSomething(const boost::function<bool ()>& condition, other stuff);
Run Code Online (Sandbox Code Playgroud)
此函数执行一些工作,仅在条件为真时返回.这个条件已被表达为仿函数参数,因为我想在不同的呼叫站点提供不同的条件.
现在,直接使用它是相当简单的,但它需要声明许多小的一次性函数或函子对象,如果可能的话我想避免使用它们.我一直在关注Boost的lambda库,以寻找可能的方法来消除这些,但我认为我缺少一些基本的东西; 我无法让它做我想做的事.
有一个案子让我感到难过:我有一个std::vector叫做的集合data; 我所追求的条件是当该size()集合达到某个阈值时.从本质上讲,我希望我的condition仿函数在返回时返回true data.size() >= threshold,否则返回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);
Run Code Online (Sandbox Code Playgroud)
在进入时DoSomething,大小为0 - 即使在运行过程中大小增加,调用condition()总是看起来大小为0.追踪它(通过Boost的内部结构有点棘手),而它似乎greater_equal每次condition()评估都会调用它,它似乎没有调用size().
那么我完全搞砸了什么基本的东西?是否有更简单的方式来表达这种事情(同时仍然保持代码尽可能内联)?
理想情况下,我希望尽可能接近C#等效代码流畅度:
DoSomething(delegate() { return data.size() >= threshold; }, other stuff);
DoSomething(() => (data.size() >= threshold), other stuff);
Run Code Online (Sandbox Code Playgroud)