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 :

Méthode template const


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 39
    Par défaut Méthode template const
    Bonjour,
    Dans une classe j'ai cree une methode template. Le parametre template est un bouléen "isConst".
    Le comportement du code est correct, mais j'aimerai que la méthode soit const dans un cas et non const dans l'autre, au sens ou elle ne change pas les données membres de la classe.

    Evidemment, je pourrais dupliquer le code pour faire un cas const et un autre cas non const, mais je me demandais si il y avait une façon plus élégante de faire ça.

    exemple (les variables commençant par un underscore sont des données membre de la classe) :

    La méthode que je veux const ou non const

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     template <bool isConst> inline void inCircleListFromNULL(    std::vector<simplex<scalar_type> *> & toDelete,\
    std::vector<pathToFace<scalar_type> > & visibleFaces,\
    scalar_type * const & point)
    {
        //....DU CODE
        typedef typename std::list<pathToFace<scalar_type> > LPTF;
        IncrementOrErase<LPTF,isConst>::apply(_externFaces,il);
        //... DU CODE
    }
    Avec :

    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
     //La fonction IncrementOrErase FAIT ++il ou il=container.erase(il) 
    //selon si isConst est true ou false
    template <class container_type, bool isConst> struct IncrementOrErase;
    template <class container_type> struct IncrementOrErase<container_type,false>
    {
        static inline void apply(container_type & cont, typename container_type::iterator & il)
        {
            il = cont.erase(il);
        }
    };
    template <class container_type> struct IncrementOrErase<container_type,true>
    {
        static inline void apply(const container_type & cont, typename container_type::const_iterator & il)
        {
            ++il;
        }
    };
    Merci d'avance,

    S.

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Utilise [code] déja, pour que ce soit lisible.

  3. #3
    Membre chevronné

    Inscrit en
    Août 2007
    Messages
    300
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 300
    Par défaut
    Il y a une contradiction entre l'utilisation d'un paramètre template (donc entièrement définissable par l'utilisateur), et la détermination d'une valeur par le compilateur (donc non définissable par l'utilisateur). En particulier, on peut écrire "IncrementOrErase<LPTF,true>::apply(_externFaces,un_iterateur_non_const);". Bien sûr, si on veut pouvoir écrire ceci, l'avortement rétroactif du programmeur concerné s'impose très naturellement comme la seule solution vraiment élégante.
    Par ailleurs, quitte à mettre un namespace si on a peur de la pollution de l'espace des noms, une classe ne contenant que des fonctions statiques de même nom est avantageusement remplacée par la surcharge bête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    template < class C >  void apply ( const C& c, typename C::const_iterator& i ) { i++; }
    template < class C >  void apply (       C& c, typename C::iterator&       i ) { i = c.erase(i); }

  4. #4
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 39
    Par défaut
    Quand tu dis qu'on peut écrire "IncrementOrErase<LPTF,true>::apply(_externFaces,un_iterateur_non_const);", je ne vois pas pourquoi : celà donnerait une erreur de compilation (conversion impossible d'un iterateur non const en const_iterator.) En tous cas je ne veux pas du tout pouvoir écrire ceci évidemment.

    Ce que je veux c'est que la méthode
    template <bool isConst> inline void inCircleListFromNULL(..) ait un prototype const dans le cas isConst==true et pas dans l'autre cas ie,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     template <true> inline void inCircleListFromNULL(..) const;
    //et
     template <false> inline void inCircleListFromNULL(..); //Pas const
    Le but est d'ajouter le mot clef const à la fin de la méthode dans le cas isConst==true.

    En tous cas merci pour la réponse. C'est sûr que la méthode par surcharge est plus simple pour ce qui est de apply.

    S.

  5. #5
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Tu peux faire ça avec SFINAE je pense.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    template<bool isConst>
    typename enable_if_c<isConst, void>::type inCircleListFromNULL(..) const;
     
    template<bool isConst>
    typename disable_if_c<isConst, void>::type inCircleListFromNULL(..); //Pas const

  6. #6
    Membre chevronné

    Inscrit en
    Août 2007
    Messages
    300
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 300
    Par défaut
    Citation Envoyé par nikopol82 Voir le message
    Quand tu dis qu'on peut écrire "IncrementOrErase<LPTF,true>::apply(_externFaces,un_iterateur_non_const);", je ne vois pas pourquoi : celà donnerait une erreur de compilation (conversion impossible d'un iterateur non const en const_iterator.) En tous cas je ne veux pas du tout pouvoir écrire ceci évidemment.
    Je voulais simplement souligner que l'écriture manuelle de "true" était redondante, puisque le compilateur n'acceptera que "false". Quant à ma blague pourrie, faut pas faire attention...
    L'ajout de "const" n'est pertinent que pour des fonction membres d'une classe, dont en l'occurrence l'existence n'est pas justifiée dans le code proposé (cette classes est artificielle, car ne contenant que des fonctions membres statiques, elle a donc la fonction d'un namespace). Par contre, si la classe a ses raisons d'exister par ailleurs, alors il suffit d'utiliser la même technique de surcharge pour les fonctions, cette fois membres et non indépendantes, ce qui aboutit bien sûr à l'ajout du mot const.

  7. #7
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 39
    Par défaut Fonction membre dans une classe
    Bonjour,
    Bien entendu, toutes ces fonctions sont bien des fonctions membres d'une classe. J'ai bien compris le sens du mot const en fin de prototype et c'est aussi pourquoi j'ai parlé de méthodes et pas de fonctions.
    S.

  8. #8
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 39
    Par défaut Merci loufoque
    Ta méthode semble résoudre mon problème. Réponse précise et rapide.

    S.

Discussions similaires

  1. Méthode template intelligente
    Par Takahani dans le forum Langage
    Réponses: 17
    Dernier message: 08/02/2008, 19h57
  2. Méthode template : déclaration/définition et appel ?
    Par kidpaddle2 dans le forum Langage
    Réponses: 3
    Dernier message: 22/04/2007, 14h09
  3. Méthode template dans classe non template ?
    Par shenron666 dans le forum Langage
    Réponses: 12
    Dernier message: 04/09/2006, 17h50
  4. Appeler une méthode template d'un paramètre template
    Par YéTeeh dans le forum Langage
    Réponses: 2
    Dernier message: 26/08/2006, 12h50
  5. Méthode template virtuelle
    Par ced1 dans le forum Langage
    Réponses: 6
    Dernier message: 13/11/2005, 15h14

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