IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

[C++11] Templates variadiques et fonctions lambdas


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut [C++11] Templates variadiques et fonctions lambdas
    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 ?

  2. #2
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    Bonjour,
    Citation Envoyé par Steph_ng8 Voir le message

    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 ?
    Non.
    Malheureusement le problème vient du fait que GCC ne sait pas correctement capturer un pack d'argument dans une lambda. C'est un bug reporté depuis 2009
    http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41933
    http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41934

    Y a-t-il un moyen de faire passer les paramètres template via la fonction lambda ?
    Il ne me semble pas, tant que ce bug est présent et c'est bien dommage.

  3. #3
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    Arf...
    Ok, merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 08/12/2014, 14h08
  2. Réponses: 18
    Dernier message: 29/08/2013, 14h04
  3. Redéfinir le template de la fonction equals() sous eclipse
    Par Faiche dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 24/02/2009, 14h41
  4. Réponses: 3
    Dernier message: 22/11/2006, 21h10
  5. Template d'une fonction (!= classe)
    Par Rodrigue dans le forum Langage
    Réponses: 7
    Dernier message: 08/05/2006, 22h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo