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

 C++ Discussion :

Boost::tuples, Templates, Nombre de paramètre


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 356
    Par défaut Boost::tuples, Templates, Nombre de paramètre
    Bonjour, après avoir regardé les fonctionnalités de boost::tuples, je me suis demandé comment c'était programmé :
    Le constructeur de tuple prend un nombre de paramètres infini (contrairement aux std::pair que je vois comment programmer). Or la seule façon que je connaisse d'implémenter un nombre de paramètre indéfini est les ... que l'on récupère ensuite avec une va_liste (or je doute que se soit le cas du à l'utilisation de templates).
    Je pose donc la question :

    Comment créer un constructeur avec un nombre indéfini de paramètre et leur type indiqué grâce aux templates ?

  2. #2
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Hum un tuple ça s'implémente "aisément" avec des typelist. Sinon plus "récemment" ça se fait surtout avec le prepocessor. (plus léger etc).
    J'ai pas regardé boost::tuple mais ça doit surement être implémenté comme les autres bibliothèques qui émulent des templates variadiques (ie bind, function etc) à grand coup de prepocessor metaprogramming.
    Note qu'avec C++0x ça deviendra presque trivial avec les template variadiques supporté nativement.

  3. #3
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par défaut
    boost tuples a une amcro TUPLE_MAX_SIZE qui génére le nombre max d'elements en son sein.

    En C++0x, c'ets un bete variadics.

  4. #4
    Membre éclairé

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 356
    Par défaut
    Ce qui m'intéresse avant tout, c'est la manière qu'est programmée les fonction make_tuple car je dois créer une fonction qui marche à peu près de la même manière. Si quelqu'un pourrais me faire part de pistes pour la création d'une telle fonction... (Nombre d'argument indéterminé mais types différents mais pris en compte par les templates , appel du constructeur de tuple avec un nombre d'argument indéterminé, ...)

  5. #5
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    On t'a donné les pistes... Si t'as la chance de pouvoir choisir ton compilo et que tu te fiches plus ou moins de la portabilité : variadics template.
    Sinon tu peux te débrouiller avec une typelist (mpl::vector ou autre) si t'es pas super à l'aise avec la PMP. (y'a plus intuitif)

  6. #6
    Membre éclairé

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 356
    Par défaut
    Les templates variadiques sont exactement ce que je voulais. Cependant, je n'ai pas trouvé le moyen de résoudre le problème majeur :

    J'ai un système de signaux. Aujourd'hui, le système de signaux est assez limité : on ne peut passer à la fonction connect qu'une fonction ayant le prototype void (*fc)(Evenement*) ou un Foncteur*
    Donc je fais un connect en faisant, un obj.connect(Event::QUIT, my_exit)
    Auquel cas, je dois créer ma propre fonction
    my_exit(Evenement* event)
    {
    exit(0);
    }

    Si possible, j'aimerais pouvoir créer un connect du type :

    obj.connect(Event::QUIT, exit (le standart), -1 (pour indiquer qu'on veut pas de Evenement* en arguement), 0 (pour indiquer que le premier argument est 0));

    ou encore obj.connect(Event::REDIM, redim, 0 (pour indiquer que l'on passera Evenement* à la position 0));

    ou encore obj.connect(ecran(endroit ou sera stocké la valeur de retour de la fonction),Event::SDL_RELOAD(exemple d'evenement imaginable), SDL_SetVideoMode, -1,800,480,32,SDL_RESIZABLE);

    etc et etc...

    Avec des templates variadiques, de telles fonctions sont - elles imaginables ?

    Ou encore faire un équivalent de boost::bind(fc,make_tuple(mes_param)) alors que fc n'est pas fait pour recevoir des tuples mais les objets constituants les tuples individuellement.

Discussions similaires

  1. [POO] Fonction à nombre de paramètres dynamique
    Par Digimag dans le forum Langage
    Réponses: 13
    Dernier message: 14/02/2008, 22h32
  2. Réponses: 7
    Dernier message: 19/05/2006, 16h47
  3. Réponses: 11
    Dernier message: 30/03/2006, 15h39
  4. [Tableaux] Choisir le nombre de paramètres
    Par MYster dans le forum Langage
    Réponses: 1
    Dernier message: 10/11/2005, 20h27
  5. Réponses: 3
    Dernier message: 10/05/2005, 11h02

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