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 :

Peut-on avoir une donnée membre template dans une classe non-template?


Sujet :

Langage C++

  1. #1
    Membre expérimenté

    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 685
    Points : 1 418
    Points
    1 418
    Par défaut Peut-on avoir une donnée membre template dans une classe non-template?
    Bonjour,

    Tout est dans le titre, mais voilà un exemple d'utilisation dont j'ai besoin :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class State
    {
     
       public : 
          bool NewTransition( const Transition<T>& transition_, const State& state_ );
     
       protected :
          std::map<Transition<T>, State& > _TransitionsList;
     
    };
    Cela semble difficilement possible à l'instanciation de ne pas définir le type pour le template... mais l'idée de faire de cette classe un template ne me plait pas (c'est pas l'idée que je m'en faisais...). Pas d'autre solution ?

    Merci d'avance


    Edit : un peu rien à voir, mais peut-on avoir en paramètre d'une fonction un type, plutôt qu'une valeur ?
    Nullius in verba

  2. #2
    Membre éclairé
    Avatar de Ekleog
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 448
    Points : 879
    Points
    879
    Par défaut
    Pour la première question, non (enfin, à part le type erasure, mais c'est une exception).

    Pour la question annexe, c'est ce qui s'appelle la métaprogrammation, programme sur les types.

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 125
    Points : 33 029
    Points
    33 029
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    j'ai envie de dire "essaye de compiler et admire les insultes du compilo !"
    Concrêtement, si ta classe possède un membre template, elle doit être template, sinon je vois pas où ni quand elle saura son type réel.
    A moins que tu puisses utiliser une classe mère de Transition que tu pourrais alors utiliser. Enfin je ne suis pas sûr de moi à ce niveau.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    class TransitionBase {};
    template< class T > class Transition {};
    class MyClass { std::map<TransitionBase*, State&> myMap; };


    Pour une simple fonction membre, pas besoin que toute la classe soit template, seule la fonction en cause doit l'être.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    template< class T >
    bool NewTransition( const Transition<T>& transition_, const State& state_ );
    un peu rien à voir, mais peut-on avoir en paramètre d'une fonction un type, plutôt qu'une valeur ?
    Généralement une fonction template fera l'affaire, mais il ne s'agit pas d'un paramètre à proprement parler.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  4. #4
    Membre expérimenté

    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 685
    Points : 1 418
    Points
    1 418
    Par défaut
    Merci pour vos réponses, je vais me contraindre à faire de cette classe un template alors..

    Pour la deuxième question, merci je vais regarder ça de plus près
    Nullius in verba

  5. #5
    Membre éclairé
    Avatar de Ekleog
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 448
    Points : 879
    Points
    879
    Par défaut
    A moins que tu puisses utiliser une classe mère de Transition que tu pourrais alors utiliser.
    C'est le type erasure. Mais ça nécessite soit une interface définie dans Transition, soit une utilisation du RTTI un peu lourde (cf. boost.any alors).

  6. #6
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 626
    Points : 30 684
    Points
    30 684
    Par défaut
    Salut,

    Par contre, une classe non template peut avoir des fonctions membres template

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class MaClass
    {
        public:
            template <iterator>
            void doSomething(iterator begin, iterator end)
            {
                while(begin!= end)
                {
                    /*...*/
                    ++ begin;
                }
            }
    };
    est tout à fait admis
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  7. #7
    Membre éclairé
    Avatar de Ekleog
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 448
    Points : 879
    Points
    879
    Par défaut
    Mais il faut alors faire attention à ne pas implémenter la fonction template dans le cpp. (oui, vécu)

  8. #8
    Membre expérimenté

    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 685
    Points : 1 418
    Points
    1 418
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Salut,

    Par contre, une classe non template peut avoir des fonctions membres template

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class MaClass
    {
        public:
            template <iterator>
            void doSomething(iterator begin, iterator end)
            {
                while(begin!= end)
                {
                    /*...*/
                    ++ begin;
                }
            }
    };
    est tout à fait admis
    (surprenant ce code avec les "iterator"... ça compile ? ^^)

    En tout cas merci pour toutes ces précisions, cela confirme en partie ce que je pensais... ce qui est dommage c'est de ne pas pouvoir déclarer un membre template privé et de définir son type à partir de son getter, appelé à l'intérieur et à l'extérieur de la classe (bon c'est pas top et puis tout ça pour éviter de coller une étiquette "template" à une classe...)

    merci pour la précision (pas dans le cpp) j'aurais fait l'erreur (je ne manipule pas si souvent que ça les templates, concrètement). Un truc pour retenir pourquoi on ne doit pas ?
    Nullius in verba

  9. #9
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Salut,

    La question est : std::map<Transition<T>, State& > est une collection de Transition<T> hétérogène (=> type erasure) ou tous les Transition d'un même State sont identiques ( State=> générique).


    Sinon, il existe Boost.Statechart pour les machines à état et Boost.Graph pour les graphes

  10. #10
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par Kaamui Voir le message
    Un truc pour retenir pourquoi on ne doit pas ?
    La F.A.Q. : Pourquoi mes templates ne sont-ils pas reconnus à l'édition des liens ?

  11. #11
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 626
    Points : 30 684
    Points
    30 684
    Par défaut
    Citation Envoyé par Kaamui Voir le message
    (surprenant ce code avec les "iterator"... ça compile ? ^^)
    Oui, oui, ca compile

    Et tu pourrais très bien l'utiliser sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int main()
    {
        MaClass cl
        T tab[5];
        cl.doSomething(tab, &tab[5]);
        std::vector< T> vector;
        cl.doSomething(vector.begin(),vector.end());
        std::list<T> list;
        cl.doSomething(list.begin(), list.end());
        std::set<T> set;
        cl.doSomething(set.begin(), set.end());
        return 0;
    }
    Bref, avec n'importe quel type présentant l'opérateur d'incrémentation et compatible avec le code (un itérateur sur une std::map sera, au final, le seul qui n'irait pas )
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  12. #12
    Membre expérimenté

    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 685
    Points : 1 418
    Points
    1 418
    Par défaut
    La question est : std::map<Transition<T>, State& > est une collection de Transition<T> hétérogène (=> type erasure) ou tous les Transition d'un même State sont identiques ( State=> générique).
    Le but est d'avoir un type de transition pour un type State donné.

    Sinon, il existe Boost.Statechart pour les machines à état et Boost.Graph pour les graphes
    Des trucs tout prêts ? non merci
    Nullius in verba

  13. #13
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par Kaamui Voir le message
    Le but est d'avoir un type de transition pour un type State donné.
    Alors c'est probablement State qui est générique, si je comprends bien.

    Citation Envoyé par Kaamui Voir le message
    Des trucs tout prêts ? non merci
    T'as raison. Mieux vaut plomber un projet en dépensant inutilement du temps à faire des choses moins bien et buguées

  14. #14
    Membre expérimenté

    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 685
    Points : 1 418
    Points
    1 418
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Alors c'est probablement State qui est générique, si je comprends bien.
    Non les transitions sont génériques (plusieurs types possibles (entrée clavier, souris, souris + clavier, évènements in-game, durée écoulée, etc), et comme un State contient une map de transitions, il semblerait qu'il doit être générique aussi (mais ça me plait pas, pour moi State devait être une simple classe de base, non instanciable, et qui se dérivait en un tas de State différents (Window, IA, Map, etc).

    Citation Envoyé par 3DArchi Voir le message
    T'as raison. Mieux vaut plomber un projet en dépensant inutilement du temps à faire des choses moins bien et buguées
    j'préfère plomber un projet et apprendre des choses

    Après tout, ne penses-tu pas qu'en réinventant la roue, même mal, je serais plus a même de manipuler des trucs tout prêts, auxquels pour l'instant je risquerais de ne rien comprendre ?

    Juste, pour résumer : pour toi la meilleure façon de progresser c'est d'apprendre comment on gère la physique dans des jeux vidéos en partant de rien, ou d'apprendre à se servir de la bibliothèque Physics pour gérer la physique dans tes jeux vidéos?

    D'habitude tu as en permanence de bonnes réflexions et je t'écoute presque les yeux fermés, mais là je trouve ton raisonnement un peu "industriel" ou "SS2I-ien"...
    Nullius in verba

  15. #15
    Membre expérimenté

    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 685
    Points : 1 418
    Points
    1 418
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Oui, oui, ca compile

    Et tu pourrais très bien l'utiliser sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int main()
    {
        MaClass cl
        T tab[5];
        cl.doSomething(tab, &tab[5]);
        std::vector< T> vector;
        cl.doSomething(vector.begin(),vector.end());
        std::list<T> list;
        cl.doSomething(list.begin(), list.end());
        std::set<T> set;
        cl.doSomething(set.begin(), set.end());
        return 0;
    }
    Bref, avec n'importe quel type présentant l'opérateur d'incrémentation et compatible avec le code (un itérateur sur une std::map sera, au final, le seul qui n'irait pas )
    là par contre ça peut pas compiler !! AH ! mou ahahahahaha

    Mais en fait c'est le mot iterator comme ça qui me heurte. c'est reconnu tel quel par les compilo ? sans typename ou inclusion d'un morecau de la STL ? (sinon c'est excellent pour faire marcher du code sur tous les conteneurs (voire sur tout ce qui a un début différent de sa fin))

    On en apprend tous les jours ici !
    Nullius in verba

  16. #16
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 479
    Points
    11 479
    Billets dans le blog
    11
    Par défaut
    Peux-tu préciser pourquoi ça ne compilerait pas ? (à part le manque de typename devant iterator, ainsi que le fait que T et MaClass ne soient pas déclarés car là à titre d'exemple)
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  17. #17
    Membre expérimenté

    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 685
    Points : 1 418
    Points
    1 418
    Par défaut
    Citation Envoyé par dragonjoker59 Voir le message
    Peux-tu préciser pourquoi ça ne compilerait pas ? (à part le manque de typename devant iterator, ainsi que le fait que T et MaClass ne soient pas déclarés car là à titre d'exemple)
    Justement c'était le manque de typename qui me génait
    Nullius in verba

  18. #18
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par Kaamui Voir le message
    Juste, pour résumer : pour toi la meilleure façon de progresser c'est d'apprendre comment on gère la physique dans des jeux vidéos en partant de rien, ou d'apprendre à se servir de la bibliothèque Physics pour gérer la physique dans tes jeux vidéos?
    Pour apprendre l'anglais, tu commences par écrire un roman en anglais ou tu lis d'abord des textes écrits par des anglophone ? J'ai appris à compter en CP mais je n'ai vu la théorie des nombres qu'une quinzaine d'années plus tard. L'idée c'est d'éviter de sauter trop de pré-requis

  19. #19
    Membre expérimenté

    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 685
    Points : 1 418
    Points
    1 418
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    L'idée c'est d'éviter de sauter trop de pré-requis
    boost.statechart n'est pas un pré-requis pour coder une machine à état. Par contre cela peut-être utile une fois que tu souhaite voir comment "les pros de chez pro" ont abordés les difficultés que tu as rencontré.

    Citation Envoyé par 3DArchi Voir le message
    J'ai appris à compter en CP mais je n'ai vu la théorie des nombres qu'une quinzaine d'années plus tard.
    c'est un mauvais exemple. Ici ton raisonnement ressemble plus à :
    (moi) "je veux apprendre à compter ! "
    (toi) "va t'acheter une calculatrice "
    (moi) "non je veux le faire par moi-même "
    (toi) "T'as raison. Vaut mieux gaspiller du temps à faire des choses que la calculatrice va faire pour toi...en plus tu va souvent te tromper, elle non. "

    Néanmoins je regarderais du côté de boost, une fois que j'aurais fait ma version moins bien et buguée
    Nullius in verba

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 11/10/2013, 12h08
  2. Réponses: 1
    Dernier message: 26/12/2010, 21h20
  3. Réponses: 4
    Dernier message: 04/09/2010, 15h32
  4. [ODBC] Récupération d'une donnée pour insertion dans une autre table
    Par rom950 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 10/03/2006, 17h13
  5. recherche d'une chaine de caractère dans une données text
    Par jdeheul dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 17/06/2004, 16h35

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