Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ boost lambda集合大小评估_C++_Functor_Boost Lambda_Boost Functional - Fatal编程技术网

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);