2013-05-13 3 views

ответ

7

Просто использовать эллипсы. В соответствии с пунктом 5.1.2/23 из C++ 11 Стандарт на:

A capture followed by an ellipsis is a pack expansion (14.5.3). [ Example:

template<class... Args> 
void f(Args... args) { 
    auto lm = [&, args...] { return g(args...); }; 
    lm(); 
} 

end example ]

Примечание: Интересно, что GCC отказывается компилировать это (см live example):

template <class T, class... A> 
void foo(T&& func, A&&... args) { 
    std::function<void()> task([func, args...]() { 
     //... 
    }); 
} 

Но учитывая выше пример из Стандарта, это определенно проблема компилятора.

+0

Удивительно, вы держите в памяти весь стандарт или просто смотрите быстро? – maverik

+0

@maverik: Конечно, я быстро посмотрел;) –

+0

Похож на эту ошибку gcc: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41933 (ваша цитата была довольно поздним дополнением к стандарту) –

3

При использовании args в захвате, вам нужно многоточие:

template <class T, class... A> 
void tpool::enqueue(T&& func, A&&... args) { 
    std::function<void()> task([func, args...]() { 
     //... 
    }); 
} 
+0

Я пробовал свой код, но не компилируется снова. Я получаю следующую ошибку: 'error: expected ',' before '...' token'' error: ожидаемый идентификатор до '...' token' 'ошибка: пакеты параметров не расширены с помощью '...'' – Mpac

+0

@ MarcoPacini Вы используете GCC? В этом случае, похоже, в компиляторе есть ошибка (как в [ответе Энди Проула] (http://stackoverflow.com/a/16527660/440558)). –

+0

Да, я использую GCC 4.7.2, установленный с macport. – Mpac

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