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 :

Etaler un tuple sur une fonction variadic membre d'une classe templatée


Sujet :

Langage C++

  1. #1
    Membre régulier
    Homme Profil pro
    Second de cuisine
    Inscrit en
    Avril 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Second de cuisine
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2005
    Messages : 193
    Points : 99
    Points
    99
    Par défaut Etaler un tuple sur une fonction variadic membre d'une classe templatée
    Bonjour !

    Fiou, quel intitulé

    Alors, prenez un tuple simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::tuple<A,B,C,E,D,...> mon_tuple;
    Maintenant, prenez une classe et son constructeur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    class X { X(A,B,C,E,D,...); };
    Puis un vecteur de cette classe:
    J'aimerais pouvoir faire un emplace_back sur le vecteur, en utilisant mes tuples.

    Evidemment, la question du std::tie ne se pose meme pas, trop lourd à la lecture et aussi si je dois changer des choses dans la classe.

    Avec une simple rechercher, je tombe sur...
    http://stackoverflow.com/questions/6...ions-arguments

    Le truc, c'est comment attraper la signature de emplace back d'un vecteur v ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
                collection_t r; // mon vecteur de pointeur
                for(...)
                {
                    auto un_tuple = ...
                    auto fn = std::mem_fn(&collection_t::emplace_back);
                    apply(fn(r), un_tuple);
    J'obtiens des erreurs du type:
    error: no matching function for call to ‘mem_fn(<unresolved overloaded function type>)’|
    Au final, ce que je fais c'est au lieu de faire
    tuple -> variables -> emplace_back
    j'aimerais sauter l'etapes des variables, et qu'un template depaquetes mon tuple sur une fonction variadic, ici, emplace_back!

    Merci, nico

  2. #2
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Bonjour,

    emplace_back pour un vector<T> prends des arguments A, B,C ... et construit sur place un objet T en appelant le constructeur T(A, B, C)

    Sauf qu'ici tu as un vector<X*> or un X* n'a pas de constructeur (c'est un simple pointeur !) donc ce que tu veux faire n'est pas possible.

    Edit : Par contre tu peux faire v.push_back(new X(A, B, C...)).
    Pour passer d'un tuple à une liste d'arguments, le moyen le plus simple à mon avis est d'utiliser une liste d'indices template {0, 1, 2, ...}, égal au nombre d'arguments A, B, C..., dans un pack et de l'étaler via std::get<I>(tuple).... comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    template <typename X, typename... Args, size_t... Idx
    void push_back_tuple_details(std::vector<X*>& v, 
                                 const std::tuple<Args...>& t, 
                                 std::index_sequence<Idx...>)
    {
        v.push_back(new X(std::get<Idx>(t)...);
    }
     
    template <typename X, typename... Args>
    void push_back_tuple(std::vector<X*>& v, const std::tuple<Args...>& t)
    {
       push_back_tuple_details(v, t, std::make_index_sequence<sizeof...(Args)>());
    }
     
    for(...)
    {
       auto un_tuple = ...
       push_back_tuple(v, un_tuple);
    }
    std::index_sequence et std::make_index_sequence font parti du standard C++14, donc hyper récent et probablement pas dispo sur ton compilateur mais tu peux trouver une implémentation ici :
    http://llvm.org/svn/llvm-project/lib...nclude/utility
    ou ici :
    http://gcc.gnu.org/viewcvs/gcc/trunk...ty?view=markup

    Après c'est vrai que ça reste quand même bien compliqué pour ce que ça fait. Dès fois je me prends à rêver d'un mécanisme du langage pour étaler automatiquement les tuple sans avoir à faire tout ce bricolage (un opérateur... peut être ? à voir en C++17...). Du coup en attendant j'essaye d'éviter les tuple au maximum car ils engendrent toujours des complications à n'en plus finir.

Discussions similaires

  1. une fonction en entrée d'une fonction
    Par lefevrelaumonier dans le forum MATLAB
    Réponses: 3
    Dernier message: 24/12/2011, 03h36
  2. Passer une Fonction comme argument d'une fonction
    Par ch16089 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 27/02/2011, 17h58
  3. Réponses: 3
    Dernier message: 16/04/2009, 08h34
  4. [Langage] une fonction comme argument d'une fonction?
    Par Krishna dans le forum Langage
    Réponses: 9
    Dernier message: 15/10/2008, 20h31
  5. passage d'une fonction en parametre d'une fonction
    Par psylox dans le forum Langage
    Réponses: 5
    Dernier message: 06/10/2008, 16h40

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