Reputation: 115
What's the correct way to do this with 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 »...«
}
Upvotes: 10
Views: 4276
Reputation: 2113
#include <functional>
template < typename ... A >
void f (A ... a) {
g (std::bind(h, a...));
}
Upvotes: 0
Reputation: 8374
I think you need to expand the pack a
in the capture list as well, like this:
template < typename ... A >
void f (A ... a) {
g ([&, a...] () { h (a...); });
}
Here is the relevant text from the C++0x Final Committee Draft, section 5.1.2.23:
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 ]
Upvotes: 16