Pointeur de template

Pointeur de template - C++ - Programmation

Marsh Posté le 12-07-2007 à 19:28:47    

Salut,
 
j'ai une structure template qui me permet de gérer juste le paramétrage du type (int, float, etc etc)
 
je souhaite faire un tableau constitué de ces éléments --> pointeur
 
problème : je veux pouvoir mettre dans le tableau, des instanciations de ce template avec des type différents
 
exemple :
-----------------------------------------
template <class type> struct MyStruct{...};
 
MyStruct**   array;
 
array = new MyStruct*[10];
array[0] = new MyStruct<int>;
array[1] = new MyStruct<float>;
array[2] = new MyStruct<double>;
 
etc
-------------------------------------
 
Bien entendu, cette syntaxe ne marche pas.
 
Est-ce que vous savez si déjà c'est possible, et si oui quelle est la bonne syntaxe ?

Reply

Marsh Posté le 12-07-2007 à 19:28:47   

Reply

Marsh Posté le 12-07-2007 à 20:16:53    

Tu ne pourrais pas essayer de faire un héritage.
Sans entrer dans le détail de la programmation, on peut imaginer de créer une classe "Article" puis des classes héritant de Article qui se nommeraient "Fruit","Voiture" ou "Animaux" et qui hériteraient de "Article". Tu pourrais ensuite créer un unique tableau destiné à stocker des objets de type "Article" et y placer des objets de chacune de ces trois classe, sans aucun problème.
 
J'espère avoir été à peu près clair. Cela donne quelque chose comme :
 
[cpp]
 
class MyStruct
{
....
}
 
class Entier : public MyStruct
{
....
 
private :
 
int un_entier;
}
 
class Flottant : public MyStruct
{
....
 
private :
 
float un_float;
}
 
 
class DoublePrecision : public MyStruct
{
....
 
private :
 
double un_double;
}
 
....
 
MyStruct* tableau = new MyStruct[10]; // Tableau d'objet pouvant contenir des objets de la classe Entier, Flottant ou DoublePrecision
 
[\cpp]
 
Qu'en penses-tu ?

Reply

Marsh Posté le 12-07-2007 à 20:17:40    

Tu ne pourrais pas essayer de faire un héritage.  
Sans entrer dans le détail de la programmation, on peut imaginer de créer une classe "Article" puis des classes héritant de Article qui se nommeraient "Fruit","Voiture" ou "Animaux" et qui hériteraient de "Article". Tu pourrais ensuite créer un unique tableau destiné à stocker des objets de type "Article" et y placer des objets de chacune de ces trois classe, sans aucun problème.  
 
J'espère avoir été à peu près clair. Cela donne quelque chose comme :  
 

Code :
  1. class MyStruct
  2. {
  3. ....
  4. }
  5. class Entier : public MyStruct
  6. {
  7. ....
  8. private :
  9. int un_entier;
  10. }
  11. class Flottant : public MyStruct
  12. {
  13. ....
  14. private :
  15. float un_float;
  16. }
  17. class DoublePrecision : public MyStruct
  18. {
  19. ....
  20. private :
  21. double un_double;
  22. }
  23. ....
  24. MyStruct* tableau = new MyStruct[10]; // Tableau d'objet pouvant contenir des objets de la classe Entier, Flottant ou DoublePrecision

 
 
Qu'en penses-tu ?
 
PS : désolé pour le message précédent sans les bonnes balises

Reply

Marsh Posté le 12-07-2007 à 20:36:27    

Salut,

Vel-Ryphon a écrit :

je souhaite faire un tableau constitué de ces éléments --> pointeur


Non, vector (edit: ou autre conteneur bien sûr)

Vel-Ryphon a écrit :

problème : je veux pouvoir mettre dans le tableau, des instanciations de ce template avec des type différents


boost::any te conviendrait peut-être?


Message édité par IrmatDen le 12-07-2007 à 20:37:06
Reply

Marsh Posté le 12-07-2007 à 21:30:37    

Les différentes spécialisations d'un template sont des types qui n'ont rien en commun.  Si tu veux les mettre dans un conteneur, il y a deux solutions.  Soit tu encapsules dans un type adéquat (boost::any ou quelque chose de plus spécialisé), soit tu donnes une classe de base à ton template:
 

Code :
  1. struct MyStructBase {
  2.    ...
  3. };
  4. template <typename T> struct MyStruct: MyStructBase {
  5.    ...
  6. };
  7. std::vector<MyStructBase*> array;
  8. array.push_back(new MyStruct<int> );
  9. array.push_back(new MyStruct<double> );

Reply

Marsh Posté le 12-07-2007 à 22:31:14    

Merci pour vos réponse !
 
Pour l'héritage, je ne souhaite pas créer de classe, mais rester dans les struct, c'est ma norme de programmation pour mon problème
 
Pour boost::any, je ne connais pas du tout, est-ce que vous pourriez m'expliquer dans le détail ce que c'est ?
 
Poour les vector, je préfère encore une fois travailler à la mano avec un pointeur, norme de prog.
 
Enfin, pour l'exemple de UnProgrammeur, je ne comprends pas trop :si MyStructBase n'est pas un template, quèy place-t-on comme attribut sachant que tout attribue étant de type paramétrable ne peut pas s'y trouver ?

Reply

Marsh Posté le 12-07-2007 à 22:42:11    

Vel-Ryphon a écrit :


Pour l'héritage, je ne souhaite pas créer de classe, mais rester dans les struct, c'est ma norme de programmation pour mon problème


Norme de merde, t'as qu'a faire du C tant que tu y est :o
 

Vel-Ryphon a écrit :


Pour boost::any, je ne connais pas du tout, est-ce que vous pourriez m'expliquer dans le détail ce que c'est ?


Nous non, eux oui : http://www.boost.org/doc/html/any.html
 

Vel-Ryphon a écrit :


Poour les vector, je préfère encore une fois travailler à la mano avec un pointeur, norme de prog.


Norme de merde, le retour
 

Vel-Ryphon a écrit :


Enfin, pour l'exemple de UnProgrammeur, je ne comprends pas trop :si MyStructBase n'est pas un template, quèy place-t-on comme attribut sachant que tout attribue étant de type paramétrable ne peut pas s'y trouver ?


Revise tes bases de C++ : http://frog.isima.fr/antoine/heritage.shtml :o

Reply

Marsh Posté le 12-07-2007 à 23:26:38    

Merci pour la réponse, même si elle était un peu agressive -_-

Reply

Marsh Posté le 13-07-2007 à 09:33:28    

Vel-Ryphon a écrit :

Pour l'héritage, je ne souhaite pas créer de classe, mais rester dans les struct, c'est ma norme de programmation pour mon problème


 
C'est quoi cette norme? Il n'y a pas de difference entre class et struct a part l'accessibilite par defaut des membres et des classes de base.
 

Citation :

Pour boost::any, je ne connais pas du tout, est-ce que vous pourriez m'expliquer dans le détail ce que c'est ?


http://www.boost.org
 

Citation :

Poour les vector, je préfère encore une fois travailler à la mano avec un pointeur, norme de prog.


 
Tu es sur que tu ne veux pas programmer en assembleur?  :whistle:  
 

Citation :

Enfin, pour l'exemple de UnProgrammeur, je ne comprends pas trop :si MyStructBase n'est pas un template, quèy place-t-on comme attribut sachant que tout attribue étant de type paramétrable ne peut pas s'y trouver ?


 
Tu y places ce dont tu as besoin.  A priori c'est independant du parametre template puisque tu veux justement faire des manipulations independantes de celui-ci.

Reply

Marsh Posté le 13-07-2007 à 10:01:34    

merci UnProgrammeur, apparemment ça marche nickel avec la solution que tu m'as proposé à la fin, et c'est exactement ce que je recherchais ^^.
 
Encore merci

Reply

Marsh Posté le 13-07-2007 à 10:01:34   

Reply

Marsh Posté le 13-07-2007 à 10:01:41    

Vel-Ryphon a écrit :

Merci pour la réponse, même si elle était un peu agressive -_-


Bah, faut juste apprendre à décoder les ":o" :o

Reply

Marsh Posté le 19-07-2007 à 18:01:39    

Est-il possible d'ajouter des fonctions virtuelles dans le code proposé par Programmeur pour y accéder ensuite via array[i]->Truc(machin) ?
(où le type de machin correspont à celui du MyStruct en i)


Message édité par preposterus le 19-07-2007 à 18:08:03
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed