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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif

    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
    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 ?

  2. #2
    Membre émérite
    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
    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 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    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 très actif

    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
    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

  5. #5
    Membre émérite
    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
    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
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    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 émérite
    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
    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 très actif

    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
    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 ?

+ 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