Y'aurait t'y moyen de déterminer le type d'une variable? - C++ - Programmation
Marsh Posté le 19-09-2002 à 16:01:32
oui : si y a "int" devant sa déclaration c'est un entier, etc...
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 ?
Up déguisé...
Marsh Posté le 19-09-2002 à 17:12:50
Ben si tu as
Code :
|
Ben dans la fonction il t'es impossible de connaître le type de baba, donc tu l'as dans le BABA
Marsh Posté le 19-09-2002 à 17:27:32
Y a aps une bibliothéque qui le fait?
Marsh Posté le 19-09-2002 à 17:30:20
le RTTI est ton amis
Marsh Posté le 19-09-2002 à 17:38:38
kadreg a écrit a écrit : le RTTI est ton amis |
ouais, mais , 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.
Marsh Posté le 19-09-2002 à 17:43:56
wpk a écrit a écrit : c'est sale et porc. |
il y a théorie et pratique ... en particulier isKindOf() qui est souvent utile.
Marsh Posté le 19-09-2002 à 17:48:26
youdontcare a écrit a écrit : 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
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 ?
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 |
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 :
|
En fait, ça ressemble à un switch sur le type d'un objet.
Edit: Suppression d'une accolade en trop
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...
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 ;-)
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 :
|
Cette structure correspond au code xml suivant:
<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 :
|
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.
Marsh Posté le 19-09-2002 à 23:46:58
bah, et le dynamic_cast? (ou j'ai rien compris a la question)
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
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 :
|
les exceptions C++ utilisent une forme de RTTI deguisee, donc ce que tu fais c'est un peu lourd tout de meme.
LeGreg
Marsh Posté le 20-09-2002 à 06:09:00
Ceci n'existe pas:
Code :
|
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 :
|
(mieux fait avec les exceptions comme montré)
Et puis ça:
Code :
|
Voilà, c'est tout ce que j'en connaît.
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:.
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.
Marsh Posté le 20-09-2002 à 15:41:46
wpk a écrit a écrit : C'est un operateur du langage |
On peut le surcharger ?
Marsh Posté le 20-09-2002 à 19:56:03
wpk a écrit a écrit : ouais, mais , 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 :
|
Ce qui donne chez moi:
F4TotovE
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/
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.
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 ?
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...
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.
Marsh Posté le 19-09-2002 à 15:56:38
hein hein:D?