Bonjour,

J'aimerais capturer des paramètres template variadiques pour les utiliser dans une fonction lamba, mais g++ 4.5.2 sous Linux (Ubuntu 11.04) n'a pas l'air d'apprécier...

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
template <typename InputIterator, typename ResultType, typename... Args>
void apply(InputIterator first, InputIterator last,
           ResultType (std::iterator_traits<InputIterator>::value_type::*f)(Args...),
           Args&&... args)
{
    typedef typename std::iterator_traits<InputIterator>::value_type value_type;
 
    std::for_each(first, last,
                  [&](value_type const& obj) { return (obj.*f)(std::forward<Args>(args)...); });
}
me donne :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
toto.cpp:9:78: error: parameter packs not expanded with `...'
toto.cpp:9:78: note:         `args'
Par contre, code fonctionne compile bien :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
template <typename InputIterator, typename ResultType, typename... Args>
void apply(InputIterator first, InputIterator last,
           ResultType (std::iterator_traits<InputIterator>::value_type::*f)(Args...),
           Args&&... args)
{
    for( ; first != last; ++first)
        ((*first).*f)(std::forward<Args>(args)...);
}

J'imagine que le problème vient du fait que j'essaie de capturer des rvalue reference par référence.

Est-ce que c'est bien le cas ?
Y a-t-il un moyen de faire passer les paramètres template via la fonction lambda ?