Visual Studio 2005中的Lambda函数替代 - Boost Library

时间:2013-11-22 00:36:37

标签: c++ multithreading boost lambda

下面的最后一行不会在Visual Studio 2005中编译:

std::deque<int> q;
boost::condition_variable cond;
boost::mutex mu;
boost::unique_lock<boost::mutex> locker(mu);
cond.wait(locker, [](){ return !q.empty();} );  // Unlock mu and wait to be notified

我认为这是一个lambda Expression,我怀疑Visual Studio 2005编译器不支持语法... C ++ 11?除了改变我的编译器之外,我还能解决这个问题吗?

这是来自boost的类声明:

class condition_variable:
    private detail::basic_condition_variable
{
public:
    BOOST_THREAD_NO_COPYABLE(condition_variable)
    condition_variable()
    {}

    using detail::basic_condition_variable::notify_one;
    using detail::basic_condition_variable::notify_all;

    void wait(unique_lock<mutex>& m)
    {
        do_wait(m,detail::timeout::sentinel());
    }

    template<typename predicate_type>
    void wait(unique_lock<mutex>& m,predicate_type pred)
    {
        while(!pred()) wait(m);
    }

...

编译器输出:

error C2059: syntax error : '['
error C2143: syntax error : missing ')' before '{'
error C2143: syntax error : missing ';' before '{'

1 个答案:

答案 0 :(得分:2)

class UntilEmpty
{
public:
    UntilEmpty(std::deque<int>& t) : q(t) {}

    bool operator() () { return !q.empty(); }

private:
    std::deque<int>& q;
};

然后简单地使用:

UntilEmpty until_empty(q);
cond.wait(locker, until_empty);

顺便说一下,UntilEmpty通常被称为仿函数。