Bonjour à tous,

Je suis face à un petit problème de conception : je cherche à savoir s'il est possible d'énumer des types. Afin d'etre plus clair je vous donne mon code et je vous expose mon problème ensuite.

Compilateur: GCC
Environment: Code::Blocks v1


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

NB: le code de la classe Interf_Register ne pose pas de problème ici: c'est juste une interface classique (je les notes par Interf_X ou X est le nom de la classe a interfacer).


template <class INTERF_TYPE , class CONTENEUR_TYPE = std::vector<INTERF_TYPE *> >
class Register : public Interf_Register, public CONTENEUR_TYPE
{
public:
    virtual std::string GetInfo_Summary(void);

public:
    void Add (INTERF_TYPE* ToReg) {push_back(ToReg);}
    int GetSize(void) {return (int) size();}
};

template <class INTERF_TYPE, class CONTENEUR_TYPE>
std::string Register<INTERF_TYPE,CONTENEUR_TYPE>::GetInfo_Summary(void)
{
    std::ostringstream oss;
    oss << "Registre: " << GetName() << " ; Contenu: " << GetSize() << " elements.\n";
    return oss.str();
}


QQ exemples d'application de ma classe précédente:

typedef Register<Interf_Toto> Register_Toto;

typedef Register<Interf_Amination, std::deque<Interf_Amination*> > Register_Animation;
Le problème réside dans l'appel de la méthode size() contenu dans la methode GetSize() : size() est une méthode générique sur les conteneurs de la stl et le compilateur (gcc) refuse ce code car il dépend d'un template . Je pourrais lever ce problème en mettant le compilateur en mode permissif, mais j'aimerai éviter cela et garder en template le type de conteneur pour pouvoir facilement le changer plus tard (ad hoc).

En fait, je voudrais restrindre le choix de l'argument template "class CONTENEUR_TYPE" à une liste de conteneurs donnés afin de rendre plus propre ce code et ca je ne sais pas faire... J'aurai besoin de vos suggestions et de votre expérience... SVP!!!

Peut-on faire une liste de classes à la manière d'une enum (j'y connais presque rien en enum)?



j'aurais aimé avoir un truc du style:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
 
template<class interface>
enum MesConteneurQuiMArchent
{
std::vector<interface>,
std::deque<interface>,...
};  
 
et pour les template de la class Register:
 
template <class INTERF_TYPE , class MesConteneurQuiMArchent<INTERF_TYPE *> CONTENEUR_TYPE = std::vector<INTERF_TYPE *> >
... mais c'est sans doute completement foireux... Auriez vous d'autre idées pour faire restreidre cet argument template?


En espérant avoir été assez clair, et merci d'avance pour votre aide




Dalo