Bonjour à tous. Voilà, j'ai une classe template que je voudrais instancier
selon le type du template :
template <class T> class Pipo {};
// plus loin...
Pipo * pipo;
switch (Type)
{
case 0 : pipo = new Pipo<float>(); break;
case 1 : pipo = new Pipo<int>(); break;
case 2 : pipo = new Pipo<short>(); break;
}
Mais ce code ne compile pas sous VC6, car, grosso modo, le compilateur me
dit qu'il ne peut pas convertir de Pipo<float>* vers Pipo, idem pour les int
et les shorts.
Avez-vous des suggestions pour pallier ce genre de problème et avoir un
pointeur de template génétique quelques soit le type du template ? J'avais
pensé à créer une classe PipoFloat héritant de Pipo<float>, mais ça ne
semble pas résoudre le problème.
Avez-vous des suggestions pour pallier ce genre de problème et avoir un pointeur de template génétique quelques soit le type du template ? J'avais pensé à créer une classe PipoFloat héritant de Pipo<float>, mais ça ne semble pas résoudre le problème.
Tu peux faire un :
class PipoBase { // tu mets ici les opérations que tu voudras // pouvoir faire avec ton PipoBase* // en virtuelle pure ou non, selon tes besoins };
Et ensuite :
templace <class T> class Pipo : public PipoBase { // tu mets l'implémentation des fonctions // qui en ont besoin... }
Et maintenant, tu peux faire ton code :
## PipoBase * pipo; switch (Type) { case 0 : pipo = new Pipo<float>(); break; case 1 : pipo = new Pipo<int>(); break; case 2 : pipo = new Pipo<short>(); break; }
pipo->UneFonctionDePipoBase (); ##
Le problème avec cette méthode, c'est que tu ne pas retourner un objet du type du template par exemple (les fonctions de PipoBase ne peuvent pas savoir qu'on va dériver en template...).
D'ailleurs, si quelqu'un a une solution pour palier à ce dernier problème, je suis preneur :-)
Je ne sais pas si ça s'accomode à ce que tu veux faire... -- <=- Michaël "Cortex" Monerau -=>
Guillaume Gourdin wrote:
Avez-vous des suggestions pour pallier ce genre de problème et avoir
un pointeur de template génétique quelques soit le type du template ?
J'avais pensé à créer une classe PipoFloat héritant de Pipo<float>,
mais ça ne semble pas résoudre le problème.
Tu peux faire un :
class PipoBase
{
// tu mets ici les opérations que tu voudras
// pouvoir faire avec ton PipoBase*
// en virtuelle pure ou non, selon tes besoins
};
Et ensuite :
templace <class T> class Pipo : public PipoBase
{
// tu mets l'implémentation des fonctions
// qui en ont besoin...
}
Et maintenant, tu peux faire ton code :
##
PipoBase * pipo;
switch (Type)
{
case 0 : pipo = new Pipo<float>(); break;
case 1 : pipo = new Pipo<int>(); break;
case 2 : pipo = new Pipo<short>(); break;
}
pipo->UneFonctionDePipoBase ();
##
Le problème avec cette méthode, c'est que tu ne pas retourner un objet du
type du template par exemple (les fonctions de PipoBase ne peuvent pas
savoir qu'on va dériver en template...).
D'ailleurs, si quelqu'un a une solution pour palier à ce dernier problème,
je suis preneur :-)
Je ne sais pas si ça s'accomode à ce que tu veux faire...
--
<=- Michaël "Cortex" Monerau -=>
Avez-vous des suggestions pour pallier ce genre de problème et avoir un pointeur de template génétique quelques soit le type du template ? J'avais pensé à créer une classe PipoFloat héritant de Pipo<float>, mais ça ne semble pas résoudre le problème.
Tu peux faire un :
class PipoBase { // tu mets ici les opérations que tu voudras // pouvoir faire avec ton PipoBase* // en virtuelle pure ou non, selon tes besoins };
Et ensuite :
templace <class T> class Pipo : public PipoBase { // tu mets l'implémentation des fonctions // qui en ont besoin... }
Et maintenant, tu peux faire ton code :
## PipoBase * pipo; switch (Type) { case 0 : pipo = new Pipo<float>(); break; case 1 : pipo = new Pipo<int>(); break; case 2 : pipo = new Pipo<short>(); break; }
pipo->UneFonctionDePipoBase (); ##
Le problème avec cette méthode, c'est que tu ne pas retourner un objet du type du template par exemple (les fonctions de PipoBase ne peuvent pas savoir qu'on va dériver en template...).
D'ailleurs, si quelqu'un a une solution pour palier à ce dernier problème, je suis preneur :-)
Je ne sais pas si ça s'accomode à ce que tu veux faire... -- <=- Michaël "Cortex" Monerau -=>
Fabien LE LEZ
On Sun, 28 Sep 2003 20:28:01 +0200, "Guillaume Gourdin" wrote:
template <class T> class Pipo {};
// plus loin... Pipo * pipo;
Déjà, ceci ne devrait pas être accepté par le compilo.
A priori, la méthode pour résoudre ton problème est :
class Pipo_base { // Ici, les fonctions communes };
template <class T> class Pipo : public Pipo_base { ... };
Pipo_base* pipo;
switch (...) { case 0 : pipo = new Pipo<float>; break; case 1 : pipo = new Pipo<int>; break;
On Sun, 28 Sep 2003 21:49:47 +0200, "Guillaume Gourdin"
void Set(const T & Data) {_Data = Data}
Et comment voudrais-tu faire appel à une telle fonction en passant par un "Pipo*" ?
Personnellement, je parlerais pas trop de Pipo à Gourdin, des fois que ça l'excite ;)
Chris
kanze
"Michaël Monerau" wrote in message news:<Z0Gdb.164642$...
Guillaume Gourdin wrote:
Avez-vous des suggestions pour pallier ce genre de problème et avoir un pointeur de template génétique quelques soit le type du template ? J'avais pensé à créer une classe PipoFloat héritant de Pipo<float>, mais ça ne semble pas résoudre le problème.
Tu peux faire un :
class PipoBase { // tu mets ici les opérations que tu voudras // pouvoir faire avec ton PipoBase* // en virtuelle pure ou non, selon tes besoins };
Et ensuite :
templace <class T> class Pipo : public PipoBase { // tu mets l'implémentation des fonctions // qui en ont besoin... }
Et maintenant, tu peux faire ton code :
## PipoBase * pipo; switch (Type) { case 0 : pipo = new Pipo<float>(); break; case 1 : pipo = new Pipo<int>(); break; case 2 : pipo = new Pipo<short>(); break; }
pipo->UneFonctionDePipoBase (); ##
Le problème avec cette méthode, c'est que tu ne pas retourner un objet du type du template par exemple (les fonctions de PipoBase ne peuvent pas savoir qu'on va dériver en template...).
D'ailleurs, si quelqu'un a une solution pour palier à ce dernier problème, je suis preneur :-)
Je crois que boost::any pourrait faire l'affaire. Mais je me poserais des questions : pourquoi ? Qu'est-ce qu'on va réelement faire avec pipo ?
-- James Kanze GABI Software mailto: Conseils en informatique orientée objet/ http://www.gabi-soft.fr Beratung in objektorientierter Datenverarbeitung 11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16
"Michaël Monerau" <cort@meloo.com> wrote in message
news:<Z0Gdb.164642$hd6.2116640@news.chello.at>...
Guillaume Gourdin wrote:
Avez-vous des suggestions pour pallier ce genre de problème et avoir
un pointeur de template génétique quelques soit le type du template
? J'avais pensé à créer une classe PipoFloat héritant de
Pipo<float>, mais ça ne semble pas résoudre le problème.
Tu peux faire un :
class PipoBase
{
// tu mets ici les opérations que tu voudras
// pouvoir faire avec ton PipoBase*
// en virtuelle pure ou non, selon tes besoins
};
Et ensuite :
templace <class T> class Pipo : public PipoBase
{
// tu mets l'implémentation des fonctions
// qui en ont besoin...
}
Et maintenant, tu peux faire ton code :
##
PipoBase * pipo;
switch (Type)
{
case 0 : pipo = new Pipo<float>(); break;
case 1 : pipo = new Pipo<int>(); break;
case 2 : pipo = new Pipo<short>(); break;
}
pipo->UneFonctionDePipoBase ();
##
Le problème avec cette méthode, c'est que tu ne pas retourner un objet
du type du template par exemple (les fonctions de PipoBase ne peuvent
pas savoir qu'on va dériver en template...).
D'ailleurs, si quelqu'un a une solution pour palier à ce dernier
problème, je suis preneur :-)
Je crois que boost::any pourrait faire l'affaire. Mais je me poserais
des questions : pourquoi ? Qu'est-ce qu'on va réelement faire avec pipo ?
--
James Kanze GABI Software mailto:kanze@gabi-soft.fr
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16
"Michaël Monerau" wrote in message news:<Z0Gdb.164642$...
Guillaume Gourdin wrote:
Avez-vous des suggestions pour pallier ce genre de problème et avoir un pointeur de template génétique quelques soit le type du template ? J'avais pensé à créer une classe PipoFloat héritant de Pipo<float>, mais ça ne semble pas résoudre le problème.
Tu peux faire un :
class PipoBase { // tu mets ici les opérations que tu voudras // pouvoir faire avec ton PipoBase* // en virtuelle pure ou non, selon tes besoins };
Et ensuite :
templace <class T> class Pipo : public PipoBase { // tu mets l'implémentation des fonctions // qui en ont besoin... }
Et maintenant, tu peux faire ton code :
## PipoBase * pipo; switch (Type) { case 0 : pipo = new Pipo<float>(); break; case 1 : pipo = new Pipo<int>(); break; case 2 : pipo = new Pipo<short>(); break; }
pipo->UneFonctionDePipoBase (); ##
Le problème avec cette méthode, c'est que tu ne pas retourner un objet du type du template par exemple (les fonctions de PipoBase ne peuvent pas savoir qu'on va dériver en template...).
D'ailleurs, si quelqu'un a une solution pour palier à ce dernier problème, je suis preneur :-)
Je crois que boost::any pourrait faire l'affaire. Mais je me poserais des questions : pourquoi ? Qu'est-ce qu'on va réelement faire avec pipo ?
-- James Kanze GABI Software mailto: Conseils en informatique orientée objet/ http://www.gabi-soft.fr Beratung in objektorientierter Datenverarbeitung 11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16
Michaël Monerau
wrote:
Le problème avec cette méthode, c'est que tu ne pas retourner un objet du type du template par exemple (les fonctions de PipoBase ne peuvent pas savoir qu'on va dériver en template...).
D'ailleurs, si quelqu'un a une solution pour palier à ce dernier problème, je suis preneur :-)
Je crois que boost::any pourrait faire l'affaire. Mais je me poserais des questions : pourquoi ? Qu'est-ce qu'on va réelement faire avec pipo ?
J'avais eu le pb avec un système que je voulais implémenter : je voulais faire une variable d'un type que l'on veut (int, float, types persos...), et duquel on pourrait avoir la valeur. Comme un type intégral en fait, mais encapsulé pour pouvoir traiter un vector de tels objets et les manipuler chacun pareil. Voilà un code qui résume un peu (en raccourci) :
Bon, je n'ai pas mis les opérateurs et les setteurs... Mais l'idée y est. Dans la classe de base, on ne peut pas connaître le type template final. Du coup, la fonction GetValue ne peut pas renvoyer le bon type directement. Alors moi j'avais fait renvoyer un void*, que je recastais ensuite en faisant confiance au programmeur qui appelait la fonction :
Et donc, on pouvait avoir, avec une UVar, sa valeur. Maintenant, si on voulait la valeur d'une UVarBase, j'avais fait :
kanze@gabi-soft.fr wrote:
Le problème avec cette méthode, c'est que tu ne pas retourner un
objet du type du template par exemple (les fonctions de PipoBase ne
peuvent pas savoir qu'on va dériver en template...).
D'ailleurs, si quelqu'un a une solution pour palier à ce dernier
problème, je suis preneur :-)
Je crois que boost::any pourrait faire l'affaire. Mais je me poserais
des questions : pourquoi ? Qu'est-ce qu'on va réelement faire avec
pipo ?
J'avais eu le pb avec un système que je voulais implémenter : je voulais
faire une variable d'un type que l'on veut (int, float, types persos...), et
duquel on pourrait avoir la valeur. Comme un type intégral en fait, mais
encapsulé pour pouvoir traiter un vector de tels objets et les manipuler
chacun pareil. Voilà un code qui résume un peu (en raccourci) :
Bon, je n'ai pas mis les opérateurs et les setteurs... Mais l'idée y est.
Dans la classe de base, on ne peut pas connaître le type template final. Du
coup, la fonction GetValue ne peut pas renvoyer le bon type directement.
Alors moi j'avais fait renvoyer un void*, que je recastais ensuite en
faisant confiance au programmeur qui appelait la fonction :
Le problème avec cette méthode, c'est que tu ne pas retourner un objet du type du template par exemple (les fonctions de PipoBase ne peuvent pas savoir qu'on va dériver en template...).
D'ailleurs, si quelqu'un a une solution pour palier à ce dernier problème, je suis preneur :-)
Je crois que boost::any pourrait faire l'affaire. Mais je me poserais des questions : pourquoi ? Qu'est-ce qu'on va réelement faire avec pipo ?
J'avais eu le pb avec un système que je voulais implémenter : je voulais faire une variable d'un type que l'on veut (int, float, types persos...), et duquel on pourrait avoir la valeur. Comme un type intégral en fait, mais encapsulé pour pouvoir traiter un vector de tels objets et les manipuler chacun pareil. Voilà un code qui résume un peu (en raccourci) :
Bon, je n'ai pas mis les opérateurs et les setteurs... Mais l'idée y est. Dans la classe de base, on ne peut pas connaître le type template final. Du coup, la fonction GetValue ne peut pas renvoyer le bon type directement. Alors moi j'avais fait renvoyer un void*, que je recastais ensuite en faisant confiance au programmeur qui appelait la fonction :
(en vérité, c'était pour un autre usage : une suite d'options dans un de mes programmes... Mais bon).
Peut-être existe-t-il un meilleur idiôme pour faire ce que je voulais...
Mais ça me permettait d'avoir un vector<UVarBase*> et de pouvoir gérer toutes les options facilement (à partir de leur nom). Mais ça impose de faire très attention au paramètre template donne à UVarValue (UVarBase*). -- <=- Michaël "Cortex" Monerau -=>
(en vérité, c'était pour un autre usage : une suite d'options dans un de mes
programmes... Mais bon).
Peut-être existe-t-il un meilleur idiôme pour faire ce que je voulais...
Mais ça me permettait d'avoir un vector<UVarBase*> et de pouvoir gérer
toutes les options facilement (à partir de leur nom). Mais ça impose de
faire très attention au paramètre template donne à UVarValue (UVarBase*).
--
<=- Michaël "Cortex" Monerau -=>
(en vérité, c'était pour un autre usage : une suite d'options dans un de mes programmes... Mais bon).
Peut-être existe-t-il un meilleur idiôme pour faire ce que je voulais...
Mais ça me permettait d'avoir un vector<UVarBase*> et de pouvoir gérer toutes les options facilement (à partir de leur nom). Mais ça impose de faire très attention au paramètre template donne à UVarValue (UVarBase*). -- <=- Michaël "Cortex" Monerau -=>
Christophe Lephay
"Michaël Monerau" a écrit dans le message de news:unXdb.181378$
J'avais eu le pb avec un système que je voulais implémenter : je voulais faire une variable d'un type que l'on veut (int, float, types persos...), et
duquel on pourrait avoir la valeur. Comme un type intégral en fait, mais encapsulé pour pouvoir traiter un vector de tels objets et les manipuler chacun pareil. Voilà un code qui résume un peu (en raccourci) :
J'ai un jour été confronté à ce problème, et je l'ai résolu en passant par un stream pour extraire la valeur...
Chris
"Michaël Monerau" <cort@meloo.com> a écrit dans le message de
news:unXdb.181378$hd6.2304997@news.chello.at...
J'avais eu le pb avec un système que je voulais implémenter : je voulais
faire une variable d'un type que l'on veut (int, float, types persos...),
et
duquel on pourrait avoir la valeur. Comme un type intégral en fait, mais
encapsulé pour pouvoir traiter un vector de tels objets et les manipuler
chacun pareil. Voilà un code qui résume un peu (en raccourci) :
"Michaël Monerau" a écrit dans le message de news:unXdb.181378$
J'avais eu le pb avec un système que je voulais implémenter : je voulais faire une variable d'un type que l'on veut (int, float, types persos...), et
duquel on pourrait avoir la valeur. Comme un type intégral en fait, mais encapsulé pour pouvoir traiter un vector de tels objets et les manipuler chacun pareil. Voilà un code qui résume un peu (en raccourci) :
J'ai un jour été confronté à ce problème, et je l'ai résolu en passant par un stream pour extraire la valeur...
C'est-à-dire ? Je ne vois pas ce que tu veux dire... Mon but est aussi de passer par un stream ensuite pour l'afficher. Le type 'T' doit alors aussi surcharger l'opérateur '<<' pour lui...
Mais si tu fais passer directement par un stream, comment récupérer l'information si tu ne sais pas de quel type elle est ? -- <=- Michaël "Cortex" Monerau -=>
J'ai un jour été confronté à ce problème, et je l'ai résolu en
passant par un stream pour extraire la valeur...
C'est-à-dire ? Je ne vois pas ce que tu veux dire... Mon but est aussi de
passer par un stream ensuite pour l'afficher. Le type 'T' doit alors aussi
surcharger l'opérateur '<<' pour lui...
Mais si tu fais passer directement par un stream, comment récupérer
l'information si tu ne sais pas de quel type elle est ?
--
<=- Michaël "Cortex" Monerau -=>
J'ai un jour été confronté à ce problème, et je l'ai résolu en passant par un stream pour extraire la valeur...
C'est-à-dire ? Je ne vois pas ce que tu veux dire... Mon but est aussi de passer par un stream ensuite pour l'afficher. Le type 'T' doit alors aussi surcharger l'opérateur '<<' pour lui...
Mais si tu fais passer directement par un stream, comment récupérer l'information si tu ne sais pas de quel type elle est ? -- <=- Michaël "Cortex" Monerau -=>