注意:以下内容同样适用于 Boost.Thread 和 C++11 线程。
我有一个条件变量,它实际上是一个简单的布尔变量。
// assume these are global
mutex m;
condition_variable c;
boolean b = false;
我想使用wait(lock, predicate)
语法。例如,我可以使用 lambda:
c.wait(lock, [] () { return b; });
但我认为应该有一种更惯用的方式将变量包装为可调用对象。所以我发现reference_wrapper
提供了一个operator()
检索包装值的方法。因此我尝试了:
c.wait(lock, cref(b));
但是g++ (4.9.1) 不编译它,争论no matching function for call to '(boost::reference_wrapper<const bool>) ()'
(如果我使用std::ref
错误有些不同,但仍然不编译)。
不应该有reference_wrapper
资格作为条件变量的适当谓词吗?如果不是,为什么?在这种情况下,什么是正确的包装器b
?
编辑:所以@Praetorian 已经非常正确地解释了我的错误,但是,在 Boost 或标准上真的没有这样的东西(这里可能有错误):
template<typename T>
struct as_callable {
T &objref;
as_callable(T &r) : objref(r) {}
T &operator()() {
return objref;
}
};