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

C++ Discussion :

Spécialisation de fonction par rapport au template de classe


Sujet :

C++

  1. #1
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 060
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 060
    Billets dans le blog
    142
    Par défaut Spécialisation de fonction par rapport au template de classe
    Bonjour à tous,

    Bon, le titre de la discussion est peut être pas le bon.
    Pour la classe suivante :
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    #ifndef GAME_HPP
    #define GAME_HPP
     
    #include "DummyClass.hpp"
     
    #include "Clock.hpp"
    #include "NoClock.hpp"
     
    #include <iostream>
     
    template <typename GameBoard,typename GameRules, class ClockType>
    class Game : public DummyClass
    {
        private:
            GameBoard m_board;
            GameRules m_rules;
            ClockType m_clocks[GameRules::NB_PLAYERS];
     
            int moves;
     
        public:
     
            Game()
            {
                moves = 0;
            }
     
            bool checkMove()
            {
                m_rules.check(m_board);
            }
     
            void play()
            {
                while(moves < 50)
                {
                    int color = getCurrentColorTurn();
                    std::cout << "Moves : " << moves << " Color : " << color << std::endl;
                    m_clocks[color].start();
                    // GetTime
                    m_clocks[color].stop();
                    moves++;
                }
            }
     
    // Ici, j'essaie de faire une fonction, qui existe que lorsque ClockType == NoClock
    // Et une autre, lorsque ClockType == Clock
    /*
            template <GameBoard,GameRules, class NoClock>
            void setClockTime(unsigned int time)
            {
     
            }
    */
    /*
            // template <typename GameBoard,typename GameRules>
            void setClockTime<GameBoard,typename GameRules, NoClock>(unsigned int time)
            {
                for ( unsigned int i = 0 ; i < GameRules::NB_PLAYERS ; i++ )
                {
                    m_clocks[i].setTotalTime(time);
                }
            }
    */
     
            int getCurrentColorTurn()const
            {
                return (moves % GameRules::NB_PLAYERS);
            }
    };
    #endif[/quote]
    J'aimerai être capable de créer une fonction (enfin deux) qui dépendent du type d'horloge (ClockType).
    Soit, pour un ClockType bien précis, je veux que la fonction soit vide. Pour l'autre, je parcours mes horloges et j'appelle une fonction.

    Est ce possible, ou je dois totalement changer de façon de voir la chose ?


    EDIT :
    Je viens d'imaginer l'utilisation d'une fonction extérieur à la classe (qui elle est spécialisé comme il faut), qui appèle une fonction dans la classe. Le problème, c'est que le type d'horloge utilisé pour ces deux cas ne serait pas nécessairement lié
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Si tu veux spécialisé des méthodes d'une classe template, il faut que tu spécialise la classe en entier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    template<typename GameBoard,typename GameRules>
    class Game <ClockTypeX>: public DummyClass
    {
     
    }
    Sinon tu peux spécialisé une fonction (ce qui t'évites de devoir spécialiser toute la classe) et la mettre en friend de ta classe Game.

    Mais je ne suis pas sûr qu'un template soit bien nécessaire.
    Est-ce qu'une variable booléenne ne serait pas plus efficace?


    Voir passer en paramètre un pointeur sur une classe abstraite dont héritera tout tes Cloks.

  3. #3
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 060
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 060
    Billets dans le blog
    142
    Par défaut
    Si je spécialise la classe en entier, alors je dois faire une sorte de copier coller.

    Pour la spécialisation de fonction, c'est ce que j'ai pensé dans mon EDIT, mais je reste pas très très chaud car il faut spécifier son type dans l'appel (et faut être sur que le type utilisé est le même que celui spécifié).

    Pour le dernier point, je ne suis pas trop chaud, car cela limite par rapport à la classe mère.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  4. #4
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Mais es-tu vraiment obligé d'utiliser des templates?

    Je ne vois pas tellement quel est l'intérêt d'utiliser des templates dans ce cas là.
    Si tu dis que tous les Clocks doivent hériter de la classe abstraite MamanClock puis que tu utilises un référence constante sur une MamanClock en attribut privé de ta classe Game tu n'as plus besoin de template.

    Pour ton NoClock soit tu fait une classe héritée de MamanClock qui ne fait rien. Soit tu utilises un pointeur au lieu d'une référence et si le pointeur est à NULL, tu ne fait rien.

  5. #5
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 060
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 060
    Billets dans le blog
    142
    Par défaut
    Les templates dans ce cas m'évitent des pointeurs, me permette de faire un tableau de taille exactement celle qu'il me faut.
    Mais sinon, oui, j'arriverais surement à faire sans. Mais je préfère éviter l'héritage, car une NoClock c'est pas vraiment une Clock
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  6. #6
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 026
    Par défaut
    Si j'ai bien compris, tu veux faire une fonction/méthode qui initialise l'horloge sauf si c'est une NoClock.

    Dans se cas là, pourquoi ne pas faire en sorte que chacune des horloges ait une méthode setTime()? La classe NoClock aura tout simplement une méthode qui ne fera rien.

    Sinon tu peux faire en sorte que chaque horloges ai une méthode getType() et en fonction de la valeur retournée tu exécutes tel ou telle action.

    Sinon pour le NoClock qui n'est pas vraiment un clock, c'est pas tout à fait vrai, on peut le voir comme un clock inactif ou un clock cassé^^

Discussions similaires

  1. Déclenchement d'une fonction par rapport à une autre
    Par clickandgo dans le forum VBA Access
    Réponses: 4
    Dernier message: 21/06/2013, 20h08
  2. Bouton appel fonction par rapport à résultat
    Par Invité dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 25/03/2011, 18h43
  3. [Vxi] Fonction par rapport à un filtre
    Par Christophe29 dans le forum Webi
    Réponses: 9
    Dernier message: 14/12/2010, 15h51
  4. Réponses: 2
    Dernier message: 27/09/2006, 10h37
  5. [10g]Fonction des nouveaux services par rapport à la 9i
    Par Laurent Dardenne dans le forum Oracle
    Réponses: 13
    Dernier message: 04/07/2005, 13h56

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