2010-07-31 12 views
10

Cuál es la forma correcta de hacer esto con g ++:plantillas variadic para Expresiones Lambda

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 »...« 
} 

Respuesta

16

creo que es necesario ampliar el paquete de a en la lista de captura, así, como este:

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

Aquí está el texto relevante del Borrador del Comité Final de C++ 0x, sección 5.1.2.23:

Una captura seguida de una elipsis es una expansión del paquete (14.5.3). [Ejemplo:

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

- ejemplo final]

+0

Gracias. g ++ - 4.6 aún no acepta esta sintaxis del borrador: test01.cc:2:23: Fehler: expected »,« before »...« token – Thomas

+3

Lo resolví haciendo una tupla, pasándola a la función lambda y desempacando allí. – Thomas

+3

Parece que g ++ - 4.8 aún no acepta esta sintaxis, pero ICC 13.0.1 sí lo hace: http://bit.ly/14auYGy – SCFrench

0
#include <functional> 
template < typename ... A > 
void f (A ... a) { 
    g (std::bind(h, a...)); 
}