C++ boost lambda集合大小评估
我具有以下形式的功能:C++ boost lambda集合大小评估,c++,functor,boost-lambda,boost-functional,C++,Functor,Boost Lambda,Boost Functional,我具有以下形式的功能: void DoSomething(const boost::function<bool ()>& condition, other stuff); 进入DoSomething时,大小为0——即使在运行过程中大小增加,对condition()的调用似乎总是得到0的大小。跟踪它(这在Boost的内部有点棘手),虽然每次计算condition()时它似乎都在调用greater\u equal,但它似乎并没有调用size() 那么,我到底把什么基本问题搞砸了
void DoSomething(const boost::function<bool ()>& condition, other stuff);
进入DoSomething
时,大小为0——即使在运行过程中大小增加,对condition()
的调用似乎总是得到0的大小。跟踪它(这在Boost的内部有点棘手),虽然每次计算condition()
时它似乎都在调用greater\u equal
,但它似乎并没有调用size()
那么,我到底把什么基本问题搞砸了?有没有一种更简单的方式来表达这类事情(同时尽可能保持代码内联)
理想情况下,我希望它尽可能接近C#等效代码的流利程度:
DoSomething(delegate() { return data.size() >= threshold; }, other stuff);
DoSomething(() => (data.size() >= threshold), other stuff);
问题是,lambda函数存储的是
数据
向量的副本,而不是引用。因此,对副本调用size()
,而不是对正在修改的原始对象调用。这可以通过使用boost::ref
包装data
来解决,后者存储一个引用:
boost::function<size_t ()> size = boost::bind(&std::vector<std::string>::size,
boost::ref(data));
谢谢,成功了。尽管令我惊讶的是,您可以像那样将>=应用于绑定函数——特别是因为它甚至不是lambda绑定>=已为函数对象重载,但无论如何,boost::lambda::bind可能是一个更好的选择。。。
boost::function<size_t ()> size = boost::bind(&std::vector<std::string>::size,
boost::ref(data));
boost::function<bool ()> cond =
(boost::bind(&std::vector<std::string>::size, boost::ref(data))
>= threshold);
DoSomething(cond, other stuff);