OVH Cloud OVH Cloud

Typedef et templates

7 réponses
Avatar
Frédéric Mayot
Bonjour,

Une question peut-être bête (?)

J'ai un modèle de classe disons :

template <typename T> class A;

Je veux que A soit équivalent à telle ou telle autre classe suivant un
paramètre défini à la compilation. Pour cela, j'utilise une classe
helper partiellement spécialisée :

template <typename T, typename PARAM> struct helper_A {};
template <typename T> struct helper_A<T, XXX> { typedef MaClasse1
mon_type;};
template <typename T> struct helper_A<T, YYY> { typedef MaClasse2
mon_type;};

Maintenant, je voudrais que A devienne équivalent à MaClasse1 ou
MaClasse2. Je le fais avec un héritage publique :

template <typename T>
class A : public helper_A<T, T::param>::mon_type {};

Cela fonctionne mais j'aurais voulu le faire avec un typedef (problème
des constructeurs non triviaux à redéfinir, etc.). Seul souci, je ne
vois pas comment ?...

Merci.

Fred

7 réponses

Avatar
Matthieu Moy
Frédéric Mayot writes:

template <typename T>
class A : public helper_A<T, T::param>::mon_type {};

Cela fonctionne mais j'aurais voulu le faire avec un typedef (problème
des constructeurs non triviaux à redéfinir, etc.). Seul souci, je ne
vois pas comment ?...


template <typename T>
class A : public helper_A<T, T::param>::mon_type {
typedef helper_A<T, T::param>::mon_type base_class;

...

[ code utilisant "base_class" ]

};

?

--
Matthieu

Avatar
Frédéric Mayot
Matthieu Moy wrote:

template <typename T>
class A : public helper_A<T, T::param>::mon_type {
typedef helper_A<T, T::param>::mon_type base_class;

...

[ code utilisant "base_class" ]

};


Heu, non, c'est pas le but du tout... La classe A n'est pas sensé avoir
quelque ligne de code que ce soit. Je veux juste la rendre équivalente à
MaClasse1 ou MaClasse2 dans mon exemple.

Avatar
Frédéric Mayot
Yannick Le goc wrote:
Dans mon cas, je comprends que tu voudrais qu'a l'instanciation de A,
A<Toto> soit equivalent (quelle definition de l'equivalence en C++?) a
MaClasse1 ou bien MaClasse2.


En gros, je voudrais (c'est syntaxiquement faux, mais c'est peut-être
plus parlant) :
typedef MaClasse1 A<Toto1>;
typedef MaClasse2 A<Toto2>;

Donc la classe helper est le seul moyen: mais alors pqoi definir class A
: helper_A, alors que tu peux utiliser directement helper?


J'utilise A pour simplifier, c'est à dire que je supprime le paramètre
PARAM inutile qui dépend du paramètre T.

Avatar
Yannick Le goc
Frédéric Mayot wrote:
Bonjour,

Une question peut-être bête (?)

J'ai un modèle de classe disons :

template <typename T> class A;

Je veux que A soit équivalent à telle ou telle autre classe suivant un
paramètre défini à la compilation. Pour cela, j'utilise une classe
helper partiellement spécialisée :

template <typename T, typename PARAM> struct helper_A {};
template <typename T> struct helper_A<T, XXX> { typedef MaClasse1
mon_type;};
template <typename T> struct helper_A<T, YYY> { typedef MaClasse2
mon_type;};

Maintenant, je voudrais que A devienne équivalent à MaClasse1 ou
MaClasse2. Je le fais avec un héritage publique :

template <typename T>
class A : public helper_A<T, T::param>::mon_type {};

Cela fonctionne mais j'aurais voulu le faire avec un typedef (problème
des constructeurs non triviaux à redéfinir, etc.). Seul souci, je ne
vois pas comment ?...

Merci.

Fred
Pas tres clair ce que tu veux, je pense que ca vient surtout de la ton

pb: tu n'as pas bien pose le pb.
Dans mon cas, je comprends que tu voudrais qu'a l'instanciation de A,
A<Toto> soit equivalent (quelle definition de l'equivalence en C++?) a
MaClasse1 ou bien MaClasse2.
Si tu veux l'egalite stricte, ce n'est pas possible. A<Toto> sera
forcement un nouveau type.
Donc la classe helper est le seul moyen: mais alors pqoi definir class A
: helper_A, alors que tu peux utiliser directement helper?

Yannick

Avatar
Yannick Le goc
Frédéric Mayot wrote:
Yannick Le goc wrote:

Dans mon cas, je comprends que tu voudrais qu'a l'instanciation de A,
A<Toto> soit equivalent (quelle definition de l'equivalence en C++?) a
MaClasse1 ou bien MaClasse2.



En gros, je voudrais (c'est syntaxiquement faux, mais c'est peut-être
plus parlant) :
typedef MaClasse1 A<Toto1>;
typedef MaClasse2 A<Toto2>;

impossible


Donc la classe helper est le seul moyen: mais alors pqoi definir class
A : helper_A, alors que tu peux utiliser directement helper?



J'utilise A pour simplifier, c'est à dire que je supprime le paramètre
PARAM inutile qui dépend du paramètre T.


A mon sens, ta solution n'est pas mauvaise, sauf que si c'est juste par
souci d'elegance ca n'a pas vraiment d'interet.
Tu peux ecrire aussi:
template<class T>
struct A {typedef typename helper_A<T, T::param>::mon_type mon_type;};

et l'utiliser A<Toto>::mon_type, ce sera plus dans l'esprit des
templates (c++ traits pattern)


Avatar
Christophe de VIENNE
Bonjour,



Bonjour !

[snip]

Cela fonctionne mais j'aurais voulu le faire avec un typedef (problème
des constructeurs non triviaux à redéfinir, etc.). Seul souci, je ne
vois pas comment ?...



Si j'ai bien compris ton problème, je crois que ce n'est pas possible,
mais le deviendra peut-être si les typedef template sont introduits dans
la norme. Ce message de Gabriel :
http://groups.google.fr/groups?hl=fr&lr=&ie=UTF-8&selm=flbrs8nu10.fsf%40sel.cmla.ens-cachan.fr
contient des liens interessants sur le sujet.

A+

Christophe

Avatar
Frédéric Mayot
Christophe de VIENNE wrote:

Bonjour,



Bonjour !

[snip]


Cela fonctionne mais j'aurais voulu le faire avec un typedef (problème
des constructeurs non triviaux à redéfinir, etc.). Seul souci, je ne
vois pas comment ?...



Si j'ai bien compris ton problème, je crois que ce n'est pas possible,
mais le deviendra peut-être si les typedef template sont introduits dans
la norme. Ce message de Gabriel :
http://groups.google.fr/groups?hl=fr&lr=&ie=UTF-8&selm=flbrs8nu10.fsf%40sel.cmla.ens-cachan.fr

contient des liens interessants sur le sujet.

A+

Christophe


Merci beaucoup pour l'info, c'est exactement ce que je cherchais... mais
ça n'est pas encore dispo...