2010-07-31 10 views
10

Quelle est la bonne façon de le faire avec g ++:modèles VARIADIC pour lambda expressions

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

Répondre

16

Je pense que vous avez besoin d'élargir le pack a dans la liste de capture ainsi, comme ceci:

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

Voici le texte pertinent du Comité final C++ 0x projet, section 5.1.2.23:

une capture suivie de points de suspension est un extension du paquet (14.5.3). [Exemple:

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

- exemple final]

+0

Merci. g ++ - 4.6 n'accepte pas encore cette syntaxe du test: test01.cc:2:23: Fehler: attendu »,« avant »...« jeton – Thomas

+3

Je l'ai résolu en créant un tuple, en le passant à la fonction lambda et déballage là. – Thomas

+3

Il semble que g ++ - 4.8 n'accepte toujours pas cette syntaxe, mais ICC 13.0.1 le fait: http://bit.ly/14auYGy – SCFrench

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