Вариативные шаблоны для лямбда-выражений - PullRequest
10 голосов
/ 31 июля 2010

Как правильно сделать это с g ++:

template < typename F >
void g (F f);

template < typename ... A >
void h (A ... a);

template < typename ... A >
void f (A ... a) {
  g ([&a] () { h (a...); }); // g++-4.6: error: parameter packs not expanded with »...«
}

Ответы [ 2 ]

16 голосов
/ 31 июля 2010

Я думаю, вам нужно расширить пакет a в списке захвата, например:

template < typename ... A >
void f (A ... a) {
  g ([&, a...] () { h (a...); }); 
}

Вот соответствующий текст из проекта окончательного комитета C ++ 0x, раздел 5.1.2.23:

.

Захват с последующим многоточием является расширение пакета (14.5.3). [Пример:

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

- конец примера]

0 голосов
/ 01 декабря 2014
#include <functional>
template < typename ... A >
void f (A ... a) {
  g (std::bind(h, a...));
}
...