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 :

Utilisation d’un conteneur générique comme type template


Sujet :

Langage C++

  1. #1
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut Utilisation d’un conteneur générique comme type template
    Bonjour,

    Je rencontre un petit problème avec l’utilisation de classe templates pour un conteneur. Soit la classe suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    template<typename element, template<typename> class container>
    class A
    {
    ...
    };
    typedef A<std::string, std::vector> Astl; // NOK
    typedef A<QString, QList> AQt; // OK
    Le problème est que std::vector prend deux arguments template, pas un seul. Et que bien que le second ait une valeur par défaut, ça ne fonctionne pas. Et comme je veux que ça marche aussi pour QList, qui elle ne prend qu’un seul argument, je ne vais pas imposer que container ait deux arguments.

    Du coup, je cherche un moyen, soit dans mon typedef, pour préciser que je veux utiliser le std::vector<T> qui utilise l’allocateur standard, soit ailleurs, pour faire en sorte que ça marche. Des idées ?

  2. #2
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Hello

    Et comme ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    template <class Container>
    struct A {
       typedef Container::value_type Element;
    };
     
    A<std::vector<std::string>> stl;
    A<Qlist<QString>> qt;

  3. #3
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    Citation Envoyé par Iradrille Voir le message
    Hello

    Et comme ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    template <class Container>
    struct A {
       typedef Container::value_type Element;
    };
     
    A<std::vector<std::string>> stl;
    A<Qlist<QString>> qt;
    Merci, mais j’aurais dû le préciser dans ma question initiale : j’utilise le conteneur pour d’autres choses que le type qui m’est passé en paramètre (des int, des bool, etc). Du coup ça ne me va pas comme solution.

  4. #4
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Avec des templates variadic du coup
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    template <class T>
    struct Foo { };
     
    template <class element, template <class...> class container>
    class A { };
    typedef A<std::string, std::vector> Astl; // OK
    typedef A<std::string, Foo> Afoo; // OK

  5. #5
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    Je n’avais pas pensé à ça.

    Finalement, je me suis débrouillé avec des classes de traits. Mais merci pour l’astuce !

  6. #6
    En attente de confirmation mail

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Points : 3 311
    Points
    3 311
    Par défaut
    Bonjour,

    Personnellement, à part de rare exception, je n'utilise plus de paramètre template template. Je mets des paramètres template simple, j'utilise boost.MPL et quand je veux passer un std::vector, je fais : std::vector<_> et après je joue avec ce que propose boost.MPL comme syntaxe pour faire le boulot.

    Exception faites de quelques cas (tordus), ça fonctionne parfaite (d'un autre côté, c'est fait pour).

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 10/05/2010, 21h35
  2. Réponses: 2
    Dernier message: 04/06/2009, 19h42
  3. Réponses: 22
    Dernier message: 03/01/2008, 22h42
  4. Conteneur générique et types des objets contenus
    Par bobuse dans le forum Langage
    Réponses: 4
    Dernier message: 12/04/2007, 11h59

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