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 :

Paramètre template non typé


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Par défaut Paramètre template non typé
    Bonjour à tous,

    Je suis actuellement confronté à un problème, j'aimerais faire quelque chose mais je ne sais pas comment le faire, malgré tout je sais que c'est possible.

    J'ai une fonction template :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    template < int value1, int value2>
    int fonction () ;
    Mais le nombre de paramètre template non typé devrait être illimité...

    On m'a montré le code suivant mais je n'ai pas compris :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    typedef a<1,2> t;
    fonction<t>() ;
    J'en déduis que de cette façon on peut également faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    typedef a<1,2,3> t;
    fonction<t>() ;
    Mais je n'ai aucune idée de comment récupérer "t" dans "fonction" et de ce que représente "a".

    Merci de votre aide.

  2. #2
    Membre Expert

    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 : 35
    Localisation : France, Doubs (Franche Comté)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    Bonsoir,

    Regardes du coté de boost::mpl, ca pourras t'aider.

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    //Une fonction template qui prends en paramètre une séquence ...
    template<class Seq>
    void foo()
    { 
        std::cout << mpl::at<S,2>::value;
        //... d'entiers (à cause du "value")
        //affiche le second entier (de type int) de la séquence
    };
     
    typedef mpl::vector_c<int,0,1,2,3> ma_sequence;
    foo<ma_sequence>();
    // ou si tu préfères
    foo<mpl::vecotr_c<int,0,1,2,3> >();
    Et la dernière ligne est bien l'objectif recherché.

    mpl::vector_c c'est une séquence d'entier connue à la compilation, comme std::vector qui est une séquence d'objet. Si tu veux voir comment est codé mpl::vector_c, plonges toi dans le code de boost::mpl (le "principe" est pas forcément difficile à saisir, mais ca peut se révèlé plus complexe et laborieux à écrire pour obtenir la même qualité que boost::mpl).

    NB: Pas certain que mon code compile, pas testé, cependant l'idée est là je pense.

  3. #3
    Membre Expert Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Par défaut
    C'est tout à fait ce genre de chose que je veux faire !

    Par contre j'ai été voir les mpl.hpp et c'est un vrai méli-mélo de macro...

    Vous n'auriez pas un exemple plus simple ou d'autres ressources ?

    Merci beaucoup.

    EDIT je viens de voir que je n'avais pas posté dans la section la plus approprié et je m'en excuse.

  4. #4
    Membre Expert

    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 : 35
    Localisation : France, Doubs (Franche Comté)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    Utiliser directement boost::mpl n'est pas enviseagble ? On n'est pas obliger de réinventer la roue à chaque fois.

    Je ne me risquerais pas à poster un implémentation de mpl::vector_c, mais je peux te montrer une structure de type list (le plus simple pour commencer je pense), avec les variadics :
    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
    21
    22
    23
    24
     
    template<int...>
    struct ListInt;
     
    template<int I, int... T>
    struct ListInt<I,T...>
    {
      static const int value = I;
      typedef ListInt<T...> Tail;
    };
     
    template<class Seq, size_t I>
    struct At
    { static const int value = At<typename Seq::Tail,I-1>::value; };
     
    template<class Seq>
    struct At<Seq,0>
    { static const int value = Seq::value; };
     
    template<class Seq>
    void foo()
    { std::cout << At<Seq,2>::value; }
     
    foo<ListInt<0,1,2,3> >();
    (Si tu as pas les variadics ca se fait mais le code est plus long à écrire et répétitif)

    PS: J'avais pas fait attention à la section, je déplace dans langage.

  5. #5
    Membre Expert Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Par défaut
    J'avais vu les variadics mais je ne peux pas les utiliser pour mon projet (qui est, en fait, un projet boost pour le google summer of code) car elles font partie de la norme C++0x.

    Enfin je pense que la librairie boost "preprocessor" est celle qui permet d'écrire ce genre de code. J'ai trouvé ce genre de fichier qui doit permettre les répétitions :

    http://svn.boost.org/svn/boost/trunk...ion/repeat.hpp

    Par contre utiliser toutes ces macros me semblent bien compliqué sans avoir compris le principe.
    Est-ce que tu pourrais m'expliquer comment ça fonctionne ?

    Merci beaucoup et bonne journée.

  6. #6
    Membre Expert

    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 : 35
    Localisation : France, Doubs (Franche Comté)

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

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

    Je réitère ma question : tu ne peux pas utiliser directement boost::mpl ? Ca sera bien plus simple.

    Sinon, tu as regarder la doc de boost, je suis certain que l'utilisation de ces macros y est expliqué, pas pour autant que recoder boost::mpl::vector_c sera simple ...

    PS: Sans variadics regardes les TyeList de Loki, ca se comprend mieux que mpl::list, et comme type tu mets des std::integral_constant<int, value> (classe facile à recoder si tu peux pas utiliser le C++2011).

    PS2: Pour recoder une list de type tu devrais trouver plein de doc sur internet, c'est assez classique. mpl::vector est moins classique mais plus performent en général (perf à la compilation).

    Edit: http://www.boost.org/doc/libs/1_47_0...doc/index.html (pour la doc de BOOST_PP_REPEAT par exemple)

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

Discussions similaires

  1. paramètres pilote non plug and play
    Par alberico dans le forum Windows XP
    Réponses: 4
    Dernier message: 17/08/2006, 20h38
  2. Réponses: 4
    Dernier message: 10/05/2006, 10h36
  3. Déclarer un paramètre template comme friend
    Par YéTeeh dans le forum Langage
    Réponses: 4
    Dernier message: 11/04/2006, 14h00
  4. X paramètres templates
    Par Alp dans le forum C++
    Réponses: 8
    Dernier message: 04/04/2006, 22h10
  5. transformer un buffer non typé en string
    Par bjl dans le forum Langage
    Réponses: 6
    Dernier message: 07/01/2006, 12h14

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