2013-11-22 2 views
2

Последняя строка ниже не будет компилировать в Visual Studio 2005:Lambda Функция Замены в Visual Studio 2005 - Библиотека Boost,

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 

Я думаю, что это лямбда-выражение, и я подозреваю, что Visual Studio 2005 компилятор не поддержка синтаксиса ... C++ 11? В любом случае, я могу исправить это, кроме изменения моего компилятора?

Вот класс декларации от повышения:

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

...

Compiler Output:

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

Boost имеет лямбды с Boost.Lambda и Boost.Phoenix. – chris

+0

@chris: Но разве компилятор не должен поддерживать синтаксис? Если нет, то какие заголовки Boost следует включить для компиляции вышеуказанного кода? –

+0

Нет, это не так. Это его красота. Boost делает некоторые довольно удивительные вещи только с C++ 03. Во всяком случае, идите посмотреть документацию (и учебник). Это включает заголовки. – chris

ответ

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 обычно называют функтором.

+0

Простите, я случайно пропустил объявление очереди. Я добавил свой оригинальный вопрос, чтобы добавить его. –

+0

Ваше решение выше работает. Все еще интересуется добавлением поддержки лямбда с помощью предложения Криса выше, но это сложнее, чем просто добавление заголовков boost: #include "boost \ lambda \ lambda.hpp" и #include "boost \ phoenix \ phoenix.hpp". Я проверил учебник лямбда, как он и предложил. –

Смежные вопросы