Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1552 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Vecteur sans template

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Vecteur sans template

n°1304909
retrox
Posté le 14-02-2006 à 09:49:34  profilanswer
 

Bonjour
 
je voudrais savoir si quelqu'un a une idée pour implémenter un std::vector sans template ?
"Sans template" est non négociable, "std::vector" c'est simplement un exemple de conteneur générique, souple et relativement performant.
J'ai vaguement dans l'idée qu'avec des macros a gogo y a peut-etre moyen, mais la lisibilité et la maintenabilité ne sont pas à négliger dans mon cas.

mood
Publicité
Posté le 14-02-2006 à 09:49:34  profilanswer
 

n°1305663
++fab
victime du syndrome IH
Posté le 14-02-2006 à 22:31:30  profilanswer
 

retrox a écrit :

je voudrais savoir si quelqu'un a une idée pour implémenter un std::vector sans template ?
"Sans template" est non négociable, "std::vector" c'est simplement un exemple de conteneur générique, souple et relativement performant.


 
Par curiosité alors -- puisque non négociable -- pourquoi sans template ?
 

retrox a écrit :

J'ai vaguement dans l'idée qu'avec des macros a gogo y a peut-etre moyen, mais la lisibilité et la maintenabilité ne sont pas à négliger dans mon cas.


 
Peut être que la rubrique généricité de la page de Laurent Deniau pourra t'interesser :
http://ldeniau.home.cern.ch/ldenia [...] /oopc.html


Message édité par ++fab le 14-02-2006 à 22:31:59
n°1305749
chrisbk
-
Posté le 15-02-2006 à 08:39:53  profilanswer
 

je pige pas le pourquoi du "sans template", et je vois pas ce que les macros t'apporteront, les templates C++ n'etant basiquement que du gros copier coller de code

n°1305877
Veovis27
Posté le 15-02-2006 à 10:55:11  profilanswer
 

Je ne comprends pas ce que tu entends par "non négociable".
 
Ou sinon faire la programmation par Objet, cad un truc dans le genre :
 

Code :
  1. class Vector {
  2.    private:
  3.       Elements* _type;
  4.    public:
  5.       Vector(Elements* aux) : _type(aux) { }
  6. };
  7. class Elements {
  8.    //On definit toutes les methodes qu'on veut utiliser dans les elements en virtuelles pures
  9. };
  10. class 2D : public Elements {
  11.     private:
  12.         int _x;
  13.         int _y;
  14. };


 
Il faut maintenant réadapter le code à ta convenance.

Message cité 1 fois
Message édité par Veovis27 le 15-02-2006 à 10:55:39
n°1306035
skelter
Posté le 15-02-2006 à 12:49:45  profilanswer
 

Veovis27 a écrit :

Je ne comprends pas ce que tu entends par "non négociable".


 
je ne sais pas si t'a deja essayé mais faire générer des tonnes de code par des macros c'est inmaintenable (en fait pour le CPP tout le code se trouve sur la meme ligne), et tu n'aura jamais tout les controles statiques et les optimisations que permettent les templates C++, ce n'est pas un simple copier-collé

n°1306056
retrox
Posté le 15-02-2006 à 13:13:03  profilanswer
 

Pas de template parce que je me prépare à recevoir des demandes de portage sur plateforme ne disposant pas de toutes les features C++ (ça vient de commencer avec une plateforme n'ayant pas de STL  :o ).
 
Merci pour le lien ++fab, je vais jeter un coup d'oeil.
 
Veovis, le probleme avec cette approche, c'est que tu ne peux pas mettre de type de base dans ton conteneur (sauf en encapsulant chaque type de base dans une classe, mais alors la bonjour la lisibilité).

n°1306096
chrisbk
-
Posté le 15-02-2006 à 13:41:14  profilanswer
 

retrox a écrit :

Pas de template parce que je me prépare à recevoir des demandes de portage sur plateforme ne disposant pas de toutes les features C++ (ça vient de commencer avec une plateforme n'ayant pas de STL  :o ).


[:pingouino]
 

retrox a écrit :


Veovis, le probleme avec cette approche, c'est que tu ne peux pas mettre de type de base dans ton conteneur (sauf en encapsulant chaque type de base dans une classe, mais alors la bonjour la lisibilité).


 
Nan mais honnetement, en macro ca va pas etre possible, ou alors tellement laid que tu regretteras de pas avoir fait ca en asm

n°1306789
fra0
Posté le 16-02-2006 à 02:21:45  profilanswer
 

pas forcément laid, ni plus difficile à maintenir s'il ne veut absolument pas upgrader son compilateur.
 

Code :
  1. #define BuildVectorClassFor(T) \
  2. class Vector_##T { \
  3. T *data; \
  4. size_t capacity,count; \
  5. public : \
  6. Vector_##T(size_t s=256) : capacity(s), count(0) { data=(T*)::calloc(capacity,sizeof(T)); } \
  7. ~Vector_##T() { free(data); } \
  8. T& operator[](size_t i) { return data[i]; } \
  9. void push_back(const T&v) { if(count<capacity) data[count++]=v; } \
  10. };
  11. BuildVectorClassFor(int);
  12. BuildVectorClassFor(double);
  13.     int main()
  14.     {
  15.        
  16.      Vector_int t;
  17.      Vector_double x;
  18.      x.push_back(7.34);
  19.      std::cout<<x[0]<<std::endl;

n°1306798
skelter
Posté le 16-02-2006 à 08:17:59  profilanswer
 

le probleme c'est qu'il faut gérer les instenciations explicitement, si ta classe dépend d'autres classes templates (dont d'autres classes dépendent...) les instanciations seront d'autant plus dur à gérées (comment savoir si ce code n'a pas déja été défini ?)
aussi si ta une erreur dans le code accroche toi pour savoir à quelle ligne c'est (apres passage du cpp tout est sur la meme ligne)
 

n°1306799
chrisbk
-
Posté le 16-02-2006 à 08:30:04  profilanswer
 

ah ouais, c'est bandant [:pingouino]

mood
Publicité
Posté le 16-02-2006 à 08:30:04  profilanswer
 

n°1306803
chrisbk
-
Posté le 16-02-2006 à 08:48:03  profilanswer
 

et en plus tu risques pas d'avoir des symboles définis plusieurs fois dans ton progue ?

n°1306825
skelter
Posté le 16-02-2006 à 09:26:19  profilanswer
 

ouai et meme en laissant tout le code dans la déclaration de la classe ou en foutant dans le namespace anonyme il y a encore risque de de multiple definition au sein de la meme unité de compilation si on un schema de classe template avec des dépendance un peu plus complexe que ca (un truc normal quoi), c'est vraiment ingérable dans la pratique

n°1307373
fra0
Posté le 16-02-2006 à 17:38:39  profilanswer
 


^^^  
je voudrais pas me faire l'avocat de cette méthode mais
il me semble que les warnings sont assez explicites pour ce qui est des redéfinitions et les erreurs pas beaucoup moins claires que cellles rencontrées avec les templates.
 
pour résoudre le problème d'origine, il faudrait avoir quelques tests unitaires sur cette improbable classe vector_sans_template
 
sinon on peut controuner le problème des "annonces" avec des classes internes :
 

Code :
  1. #define GetTypeOf(Class,Type,Identifier) Class##_##Type_##Identifier
  2. #define Vector(T,I) \
  3. class GetTypeOf(Vector,T,I) { \
  4. T *data; \
  5. size_t capacity,count; \
  6. public : \
  7. GetTypeOf(Vector,T,I) (size_t s=256) : capacity(s), count(0) { data=(T*)::calloc(capacity,sizeof(T)); } \
  8. ~GetTypeOf(Vector,T,I) () { free(data); } \
  9. T& operator[](size_t i) { return data[i]; } \
  10. void push_back(const T&v) { if(count<capacity) data[count++]=v; } \
  11. } I;
  12.     int main()
  13.     {
  14.      Vector(double,x);
  15.      Vector(double,y);             
  16.      x.push_back(7.34);
  17.      std::cout<<x[0]<<std::endl;
  18.     }

n°1307379
chrisbk
-
Posté le 16-02-2006 à 17:57:22  profilanswer
 

CAI HORRIBLE LOIN DE MOI CE TRUC

n°1307388
fra0
Posté le 16-02-2006 à 18:07:59  profilanswer
 

bon désolé, demandez gentiment de ma part à Markus Oberhumer
 
http://www.oberhumer.com/products/nrv/

n°1307390
skelter
Posté le 16-02-2006 à 18:09:32  profilanswer
 

chouette, comme ca tout le code est dans le main
serieux ca sert a rien de continuer, c'est ingérable, c'est tout

n°1307391
chrisbk
-
Posté le 16-02-2006 à 18:09:53  profilanswer
 

bin jsais pas si t'es allé voir le code miniLZO, par exemple, mais c'est absolument imbitable

n°1307394
fra0
Posté le 16-02-2006 à 18:11:27  profilanswer
 

clair j'y ai participé :o)

n°1307413
chrisbk
-
Posté le 16-02-2006 à 18:37:23  profilanswer
 

[:pingouno] autant c'est pratique, ca marche bien et tout, autant le code est affreux, encore plus que la zlib, ce qui n'est pas rien.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Vecteur sans template

 

Sujets relatifs
Probleme de vecteur[C++] Template... erreur tte bete surement...
erreur de spécialisation d'un template ...[resolu] [perl] problème "lib text::template" suite migration server
Utilisation templatevecteur de string static
Problème avec un template: balise boddy déséquilibréeAvancement de mon moteur de template ...
vecteur de poiteur sur fonctionPHP, TEMPLATE ET APPLET
Plus de sujets relatifs à : Vecteur sans template


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR