Y'aurait t'y moyen de déterminer le type d'une variable?

Y'aurait t'y moyen de déterminer le type d'une variable? - C++ - Programmation

Marsh Posté le 19-09-2002 à 15:56:38    

hein hein:D?

Reply

Marsh Posté le 19-09-2002 à 15:56:38   

Reply

Marsh Posté le 19-09-2002 à 16:01:32    

oui : si y a "int" devant sa déclaration c'est un entier, etc...


Message édité par antp le 19-09-2002 à 16:01:41

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 19-09-2002 à 16:01:33    

La question est bien : quand on voit une variable se promener dans la rue, comment reconnait-on son type ? C'est celui qui lui tient la main, non ? :lol:  
 
Up déguisé...

Reply

Marsh Posté le 19-09-2002 à 17:12:50    

Ben si tu as

Code :
  1. int toto(void* baba)
  2. {
  3. [...]
  4. }


Ben dans la fonction il t'es impossible de connaître le type de baba, donc tu l'as dans le BABA :lol:


---------------
Le site de l'année :D (XHTML 1.0 strict) : http://darkoli.free.fr/index.html
Reply

Marsh Posté le 19-09-2002 à 17:26:55    

ca pu....


---------------
bisous a machistador!!!
Reply

Marsh Posté le 19-09-2002 à 17:27:32    

Y a aps une bibliothéque qui le fait?


---------------
Le Tyran
Reply

Marsh Posté le 19-09-2002 à 17:30:20    

le RTTI est ton amis


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 19-09-2002 à 17:38:38    

kadreg a écrit a écrit :

le RTTI est ton amis




 
ouais, mais :non: , c'est pas objet . Le type d'un objet ne devrait etre connu que par le compilo. Le code du type
if (typeid(maVariable).name() == "typeDeMaVariable" )
{
...
}
 
c'est sale et porc.

Reply

Marsh Posté le 19-09-2002 à 17:43:56    

wpk a écrit a écrit :

c'est sale et porc.


:heink: il y a théorie et pratique ... en particulier isKindOf() qui est souvent utile.

Reply

Marsh Posté le 19-09-2002 à 17:48:26    

youdontcare a écrit a écrit :

:heink: il y a théorie et pratique ... en particulier isKindOf() qui est souvent utile.




 
Utile quand on a pas fait ses surcharges de méthodes correctement surtout.
 
C++, le langage qui permet de rattrapper ses conneries avec d'autres conneries


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 19-09-2002 à 17:48:26   

Reply

Marsh Posté le 19-09-2002 à 17:50:45    

kadreg a écrit a écrit :

Utile quand on a pas fait ses surcharges de méthodes correctement surtout.


hein ?

Reply

Marsh Posté le 19-09-2002 à 17:54:16    

kadreg a écrit a écrit :

 
 
Utile quand on a pas fait ses surcharges de méthodes correctement surtout.
 
C++, le langage qui permet de rattrapper ses conneries avec d'autres conneries




 :jap:

Reply

Marsh Posté le 19-09-2002 à 20:35:24    

Une idée aussi pour récuperer le type d'un objet c'est d'utiliser les exceptions.
 
Exemple :

Code :
  1. try
  2. {
  3. throw( UnknownObject )
  4. }
  5. catch( int Integer )
  6. {
  7. DoSomethingWithTheInteger( Integer );
  8. }
  9. catch( AKnownObject Object )
  10. {
  11. Object.AtLastICanUseThisMethod();
  12. }


 
En fait, ça ressemble à un switch sur le type d'un objet.
 
Edit: Suppression d'une accolade en trop


Message édité par gatorette le 19-09-2002 à 20:35:51

---------------
each day I don't die is cheating
Reply

Marsh Posté le 19-09-2002 à 22:21:45    

Mais pour quoi faire?

Reply

Marsh Posté le 19-09-2002 à 22:28:14    

Ace17 a écrit a écrit :

Mais pour quoi faire?




Oui, il faut vraiment programmer comme un porc pour avoir besoin de savoir de quel type est une variable qui se promène dans son programme...


---------------
iteme.free.fr | Mon feedback
Reply

Marsh Posté le 19-09-2002 à 23:26:54    

ITM a écrit a écrit :

 
Oui, il faut vraiment programmer comme un porc pour avoir besoin de savoir de quel type est une variable qui se promène dans son programme...
 




 
C'est dans ces moments là qu'on se rend compte que VHDL, une fois qu'on a compris un peu le labyrinthe des spécifications, ça permet de faire des programmes beaucoup plus solides, super propres, avec un choix de styles de programmation bluffant et qui offre les avantages des "objets" sans les inconvénients.
 
OK ça sert à faire du HW, mais ya bien des gens qui ont fait un serveur web avec ;-)

Reply

Marsh Posté le 19-09-2002 à 23:40:25    

J'en ai eu besoin lors du développement d'un outil pour "parser" du XML.
 
En effet, l'utilisateur définit plusieurs classes simples contenant des variables membres correspondants à ce qu'il souhaite lire. Ces classes possèdent toutes une méthode qui est appelée par mon parser.
 
Exemple de classe implémentée par l'utilisateur :

Code :
  1. class XMLOther : public XMLObjetct
  2. {
  3. public:
  4. int m_Temp;
  5. String m_String2;
  6. virtual void Parse( const XMLNode node, const XMLDoc doc )
  7. {
  8. XMLMember<>( &m_Temp, TEXT("temp" ), node, doc );
  9. XMLMember<>( &m_String2, TEXT("string" ), node, doc );
  10. }
  11. };
  12. class XMLMain : public XMLObject
  13. {
  14. public:
  15. String m_String;
  16. XMLOther m_OtherXML;
  17. std::vector<int> m_vIntegers;
  18. virtual void Parse( const XMLNode node, const XMLDoc doc )
  19. {
  20. XMLMember<>( &m_String, TEXT("string" ), node, doc );
  21. XMLMember<>( &m_OtherXML, TEXT("other" ), node, doc );
  22. XMLMember<int>( &m_vIntegers, TEXT("integer" ), node, doc );
  23. }
  24. };


 
Cette structure correspond au code xml suivant:

<main>
  <string>hello</string>
  <other>
    <temp>12</temp>
    <string>othertest</string>
  </other>
  <integer>45</integer>
  <integer>56</integer>
  <integer>12</integer>
</main>


 
Dans le cas d'une lecture, le parser lit un noeud (le XMLNode de la méthode parse) et appelle successivement tous les constructeurs de XMLMember. Dès qu'il en trouve un dont le deuxième paramètre (la chaîne) correspond au nom du noeud, il 'throw' la variable membre. Par exemple si le noeud analysé a comme nom "name", l'object m_Name sera "throwé".
 
Mon programme se retrouve donc avec un objet dont il ne sait rien et auquel il faut attribuer la valeur du noeud. Comme tous ces objets n'ont pas forcemment de méthodes permettant de les envoyer vers des string (du style operator<< ou operator>>), la méthode que j'ai choisi est de faire un catch par type que j'ai choisi.
 
Ca donne :

Code :
  1. try
  2. {
  3. Object->Parse( pChild, NULL );
  4. }
  5. catch( XMLObject *ChildObject )
  6. {
  7. ParseNode( pChild, ChildObject );
  8. }
  9. catch( String *ChildObject )
  10. {
  11. ChildObject->assign( (LPCTSTR)GetNodeContent( pChild ) );
  12. }
  13. catch( int *ChildObject )
  14. {
  15. StringStream ss;
  16. ss << (LPCTSTR)GetNodeContent( pChild );
  17. ss >> (*ChildObject);
  18. }


 
Cette méthode n'est peut être pas optimale, mais c'est la seule que j'ai trouvé qui permet de conserver un code simple pour l'utilisateur (juste une fonction "simple" à ajouter à sa structure) et qui permet de gérer des vectors ou des maps.
 
Voila, juste un exemple pour expliquer en quoi ça peut parfois être utile.


---------------
each day I don't die is cheating
Reply

Marsh Posté le 19-09-2002 à 23:46:58    

bah, et le dynamic_cast? (ou j'ai rien compris a la question)


---------------
Boulay officiel : asphro
Reply

Marsh Posté le 20-09-2002 à 05:15:07    

le rtti ce n'est pas toujours sale
en tout cas il y a des cas ou ca ne brise pas l'encapsulation
exemple: forme est une classe de base qui comprend les carres, les cercles et les rectangles, tu as une fonction s'applique a des formes et qui s'appelle 'drawOnlySquares', alors c'est pas con d'utiliser les RTTI pour faire ca.
 
evidemment c'est un peu avance et il y a surement d'autres moyens
moins propres de faire ca.
 
Pour info faenir, dynamic_cast et RTTI c'est la meme chose.
 
A+
LeGreg

Reply

Marsh Posté le 20-09-2002 à 05:17:56    

gatorette a écrit a écrit :

Une idée aussi pour récuperer le type d'un objet c'est d'utiliser les exceptions.
 
Exemple :

Code :
  1. try
  2. {
  3. throw( UnknownObject )
  4. }
  5. catch( int Integer )
  6. {
  7. DoSomethingWithTheInteger( Integer );
  8. }
  9. catch( AKnownObject Object )
  10. {
  11. Object.AtLastICanUseThisMethod();
  12. }


 
En fait, ça ressemble à un switch sur le type d'un objet.
 
Edit: Suppression d'une accolade en trop




 
les exceptions C++ utilisent une forme de RTTI deguisee, donc ce que tu fais c'est un peu lourd tout de meme.
 
LeGreg

Reply

Marsh Posté le 20-09-2002 à 06:09:00    

Ceci n'existe pas:

Code :
  1. ??? a;
  2. typeof(a) b;

Et c'est bien dommage.
C'est fortement réclamé auprès du commité de standardisation, si j'ai bien compris.
 
Y'a aussi ça:

Code :
  1. if(dynamic_cast<int&>(a)==NULL) ...; //c'est pas un int-compatible

(mieux fait avec les exceptions comme montré)
 
Et puis ça:

Code :
  1. if(typeid(a)==typeid(int)) ...; //c'est un int


 
Voilà, c'est tout ce que j'en connaît.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 20-09-2002 à 10:01:32    

typeid c'est une fonction standard?

Reply

Marsh Posté le 20-09-2002 à 10:01:52    

antp a écrit a écrit :

oui : si y a "int" devant sa déclaration c'est un entier, etc...




 
tu sors stp:sarcastic:.

Reply

Marsh Posté le 20-09-2002 à 15:40:23    

fodger a écrit a écrit :

typeid c'est une fonction standard?




 
c'est meme plus qu'une "fonction". C'est un operateur du langage qui te retourne une ref constante vers un objet de type type_info.

Reply

Marsh Posté le 20-09-2002 à 15:41:46    

wpk a écrit a écrit :

 
C'est un operateur du langage  




 
On peut le surcharger ?


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
Reply

Marsh Posté le 20-09-2002 à 19:56:03    

wpk a écrit a écrit :

 
 
ouais, mais :non: , c'est pas objet . Le type d'un objet ne devrait etre connu que par le compilo. Le code du type
if (typeid(maVariable).name() == "typeDeMaVariable" )
{
...
}
 
c'est sale et porc.




 
C'est surtout pas portable. Fait le avec un gcc pour voir.
 

Code :
  1. #include <iostream>
  2. class Toto{};
  3. int main()
  4. {
  5.   std::cout << typeid(Toto()).name() << std::endl;
  6.   return 0;
  7. }

 
 
Ce qui donne chez moi:
F4TotovE

Reply

Marsh Posté le 20-09-2002 à 19:58:25    

whygee a écrit a écrit :

 
OK ça sert à faire du HW, mais ya bien des gens qui ont fait un serveur web avec ;-)




 
Bof, y a aussi un serveur web ecrit en postscript :-)
http://www.pugo.org:8080/

Reply

Marsh Posté le 20-09-2002 à 19:59:15    

fodger a écrit a écrit :

typeid c'est une fonction standard?




 
Absolument. Et non on ne peut pas le surcharger.

Reply

Marsh Posté le 20-09-2002 à 22:08:36    

fodger a écrit a écrit :

hein hein:D?




 
comment peut on avoir besoin de connaitre le type d'une variable ?

Reply

Marsh Posté le 20-09-2002 à 23:17:18    

farib a écrit a écrit :

 
 
comment peut on avoir besoin de connaitre le type d'une variable ?




 
le seul cas ou je me sert de typeid, c'est dans une template de management de ressources, ou la template a....... plein d'utilisation, et dans les throw d'erreur de la template je mets le typeid.name() comme ça je sais dans quelle "instanciation" (ou c'est ça le bon terme ?) c'est parti en couille...

Reply

Marsh Posté le 21-09-2002 à 01:35:46    

Citation :

On peut le surcharger ?

Bonjour les dégâts si c'était possible...
 

fabsk a écrit a écrit :

Ce qui donne chez moi:
F4TotovE


C'est le comportement que j'aurais attendu de 'raw_name()'
'name()' est censé donner qquechose de compréhensible pour les humains.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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