Précédent   Forum du club des développeurs et IT Pro > C et C++ > C++ > Langage
Langage Langage C++, Programmation Orientée Objet, Templates, etc. Avant de poster : FAQ C++
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 19/12/2012, 18h24   #1
DakM
Membre du Club
 
Homme nico
Second de cuisine
Inscription : avril 2005
Messages : 143
Détails du profil
Informations personnelles :
Nom : Homme nico
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Second de cuisine
Secteur : Alimentation

Informations forums :
Inscription : avril 2005
Messages : 143
Points : 44
Points : 44
Envoyer un message via MSN à DakM Envoyer un message via Skype™ à DakM
Par défaut Double specialisation d'une classe templatée

Bonjour,

Je tente de faire une double specialisation sur une classe templatée
Voici une version courte de la classe:

Code :
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
71
72
73
74
75
76
77
78
79
80
81
82
 
class GameManager;
 
template<class Specialisation, class Argument>
class KeyboardHandler
{
public:
    enum Type
    {
        KeyDown = 1,
        KeyUp,
        KeyPress
    };
 
    typedef void(KeyboardHandler::*handlerk)(const Type& type, Argument& arg);
 
    KeyboardHandler(GameManager& gm, Specialisation& scr) :
        m_game(gm),
        m_screen(scr),
        init(false),
        last_event()
    {
        /// Arrows
        handlers[sf::Keyboard::Key::Left] = &KeyboardHandler::Left;
        handlers[sf::Keyboard::Key::Right] = &KeyboardHandler::Right;
        handlers[sf::Keyboard::Key::Up] = &KeyboardHandler::Up;
    }
 
    virtual ~KeyboardHandler()
    {
        handlers.clear();
    }
 
 
    void handleKeys(const sf::Event& event, Argument& arg)
    {
        if(!init)
        {
            last_event = event;
            init = true;
        }
        const short key = static_cast<short>(event.key.code);
 
        if(handlers.find(key) != std::end(handlers))
        {
 
            if(event.type == sf::Event::EventType::KeyPressed
               && last_event.type == sf::Event::EventType::KeyPressed)
            {
                (this->*handlers[key])(Type::KeyPress, arg);
            }
            else if(event.type == sf::Event::EventType::KeyPressed
               && last_event.type != sf::Event::EventType::KeyPressed)
            {
                (this->*(handlers[key]))(Type::KeyDown, arg);
            }
            else if(event.type == sf::Event::EventType::KeyReleased)
            {
                (this->*(handlers[key]))(Type::KeyUp, arg);
            }
            last_event = event;
        }
    }
private:
 
    void inlinit();
 
    GameManager& m_game;
    Specialisation& m_screen;
 
    bool init;
    sf::Event last_event;
 
    std::unordered_map<short, handlerk> handlers;
 
    void Left(const KeyboardHandler::Type& type, Argument& arg);
    void Right(const KeyboardHandler::Type& type, Argument& arg);
    void Up(const KeyboardHandler::Type& type, Argument& arg);
    void Down(const KeyboardHandler::Type& type, Argument& arg);
 
 
};

Je voudrais pouvoir appeler donc une certaine touche du clavier avec deux arguments different, d'où une double specialisation

En revanche, je bidouille un peu sur la définition, mais je vois pas comment.

Pour une specialisation simple c'est:

template<>
void KeyboardHandler<PremiereSpecialisation>::Up(const KeyboardHandler::Type& type);

Mais pour deux ?

Aussi, il faut que je puisse mettre ces definitions dans plusieurs fichiers .cpp séparés, d'où l'impossibilité de definir ces templates dans le header

Sauriez vous m'aider ?

merci d'avance,

nico
DakM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2012, 02h27   #2
koala01
Modérateur
 
Avatar de koala01
 
Philippe Dunski
Inscription : octobre 2004
Messages : 8 626
Détails du profil
Informations personnelles :
Nom : Philippe Dunski
Âge : 41

Informations forums :
Inscription : octobre 2004
Messages : 8 626
Points : 13 346
Points : 13 346
Envoyer un message via MSN à koala01 Envoyer un message via Skype™ à koala01
Salut,

A vrai dire, je ne suis pas sur de comprendre ce que tu entend par "double spécialisation", mais...

Si, comme je le crois, l'idée est de pouvoir avoir une spécialisation pour le cas ou la touche shift est enfoncée, une autre pour le cas ou la touche ctrl est enfoncée et une troisième pour le cas où les deux sont enfoncées, il "suffit" de faire en sorte que tes spécialisations respectent tes besoins, sous une forme proche de
Code :
1
2
3
4
5
6
7
8
9
10
11
12
struct ShiftDown
{
    /*ce qui va bien*/
};
struct CtrlDown
{
    /* ce qui va bien */
};
struct CtrlAndShiftDown
{
    /*ce qui va bien */
};
Ceci dit, je ne résiste pas à l'envie de rappeler le conseil de David Wheeler:
Citation:
Envoyé par David Wheeler
all problems in computer science can be solved by another level of indirection .
__________________
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
je ne répondrai à aucune question technique par E-mail, message visiteur ou message privé
Vous avez obtenu votre réponse pensez au bouton en bas de page
koala01 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 22h13.


 
 
 
 
Partenaires

Hébergement Web