Je voudrais récupérer les informations de RTTI d'un membre de classe,
quelque chose du genre :
#include <typeinfo>
#include <iostream>
using namespace std;
struct A
{
int i;
};
int main()
{
const type_info& info=typeid(A::i);
cout<<info.name()<<endl;
}
Ceci ne compile pas. La seule solution que j'ai trouvé pour l'instant,
c'est d'écrire typeid(A().i), mais ce n'est pas toujours utilisable
(si A n'est pas default-constructible).
Y'a-t-il une autre solution, sachant que je ne peux pas mettre de
typedef dans A? Merci d'avance
Je voudrais récupérer les informations de RTTI d'un membre de classe, quelque chose du genre :
#include <typeinfo> #include <iostream> using namespace std;
struct A { int i; };
int main() { const type_info& info=typeid(A::i); cout<<info.name()<<endl; }
Ceci ne compile pas. La seule solution que j'ai trouvé pour l'instant, c'est d'écrire typeid(A().i), mais ce n'est pas toujours utilisable (si A n'est pas default-constructible).
Y'a-t-il une autre solution, sachant que je ne peux pas mettre de typedef dans A? Merci d'avance
A mon avis, il n'y a pas d'autre solution : l'expression A::i n'est correcte que si i est un membre statique de A, ce qui n'est pas le cas dans ton exemple. A moins d'avoir un typeid(A().i), éventuellement avec les bons paramètres du constructeur (l'expression n'est pas évaluée, donc pas de problème de performances), je ne vois pas.
Arnaud Debaene wrote:
Bonjour,
Je voudrais récupérer les informations de RTTI d'un membre de classe,
quelque chose du genre :
#include <typeinfo>
#include <iostream>
using namespace std;
struct A
{
int i;
};
int main()
{
const type_info& info=typeid(A::i);
cout<<info.name()<<endl;
}
Ceci ne compile pas. La seule solution que j'ai trouvé pour l'instant,
c'est d'écrire typeid(A().i), mais ce n'est pas toujours utilisable
(si A n'est pas default-constructible).
Y'a-t-il une autre solution, sachant que je ne peux pas mettre de
typedef dans A? Merci d'avance
A mon avis, il n'y a pas d'autre solution : l'expression A::i n'est
correcte que si i est un membre statique de A, ce qui n'est pas le cas
dans ton exemple. A moins d'avoir un typeid(A().i), éventuellement avec
les bons paramètres du constructeur (l'expression n'est pas évaluée,
donc pas de problème de performances), je ne vois pas.
Je voudrais récupérer les informations de RTTI d'un membre de classe, quelque chose du genre :
#include <typeinfo> #include <iostream> using namespace std;
struct A { int i; };
int main() { const type_info& info=typeid(A::i); cout<<info.name()<<endl; }
Ceci ne compile pas. La seule solution que j'ai trouvé pour l'instant, c'est d'écrire typeid(A().i), mais ce n'est pas toujours utilisable (si A n'est pas default-constructible).
Y'a-t-il une autre solution, sachant que je ne peux pas mettre de typedef dans A? Merci d'avance
A mon avis, il n'y a pas d'autre solution : l'expression A::i n'est correcte que si i est un membre statique de A, ce qui n'est pas le cas dans ton exemple. A moins d'avoir un typeid(A().i), éventuellement avec les bons paramètres du constructeur (l'expression n'est pas évaluée, donc pas de problème de performances), je ne vois pas.
Marc Boyer
Arnaud Debaene wrote:
Je voudrais récupérer les informations de RTTI d'un membre de classe, quelque chose du genre :
#include <typeinfo> #include <iostream> using namespace std;
Ceci ne compile pas. La seule solution que j'ai trouvé pour l'instant, c'est d'écrire typeid(A().i), mais ce n'est pas toujours utilisable (si A n'est pas default-constructible).
Y'a-t-il une autre solution, sachant que je ne peux pas mettre de typedef dans A? Merci d'avance
Sur mon g++ -Wall -ansi, ça marche.
Marc Boyer -- Je ne respecte plus le code de la route à vélo depuis une double fracture due au fait que j'étais le seul à le respecter.
Arnaud Debaene wrote:
Je voudrais récupérer les informations de RTTI d'un membre de classe,
quelque chose du genre :
#include <typeinfo>
#include <iostream>
using namespace std;
Ceci ne compile pas. La seule solution que j'ai trouvé pour l'instant,
c'est d'écrire typeid(A().i), mais ce n'est pas toujours utilisable
(si A n'est pas default-constructible).
Y'a-t-il une autre solution, sachant que je ne peux pas mettre de
typedef dans A? Merci d'avance
Sur mon g++ -Wall -ansi, ça marche.
Marc Boyer
--
Je ne respecte plus le code de la route à vélo depuis une double fracture
due au fait que j'étais le seul à le respecter.
Ceci ne compile pas. La seule solution que j'ai trouvé pour l'instant, c'est d'écrire typeid(A().i), mais ce n'est pas toujours utilisable (si A n'est pas default-constructible).
Y'a-t-il une autre solution, sachant que je ne peux pas mettre de typedef dans A? Merci d'avance
Sur mon g++ -Wall -ansi, ça marche.
Marc Boyer -- Je ne respecte plus le code de la route à vélo depuis une double fracture due au fait que j'étais le seul à le respecter.
Arnaud Debaene
Marc Boyer wrote:
Sur mon g++ -Wall -ansi, ça marche.
Ah? Ca ne marche ni sur Comeau Online ni sur VC 7.1
Arnaud
Marc Boyer wrote:
Sur mon g++ -Wall -ansi, ça marche.
Ah? Ca ne marche ni sur Comeau Online ni sur VC 7.1
Ah? Ca ne marche ni sur Comeau Online ni sur VC 7.1
Arnaud
kanze
Julien Lamy wrote:
Arnaud Debaene wrote:
Je voudrais récupérer les informations de RTTI d'un membre de classe,
quelque chose du genre :
#include <typeinfo> #include <iostream> using namespace std;
struct A { int i; };
int main() { const type_info& info=typeid(A::i); cout<<info.name()<<endl; }
Ceci ne compile pas. La seule solution que j'ai trouvé pour l'instant,
c'est d'écrire typeid(A().i), mais ce n'est pas toujours utilisable
(si A n'est pas default-constructible).
Y'a-t-il une autre solution, sachant que je ne peux pas mettre de typedef dans A? Merci d'avance
A mon avis, il n'y a pas d'autre solution : l'expression A::i n'est correcte que si i est un membre statique de A, ce qui n'est pas le cas
dans ton exemple. A moins d'avoir un typeid(A().i), éventuellement avec les bons paramètres du constructeur (l'expression n'est pas évaluée, donc pas de problème de performances), je ne vois pas.
Pourquoi pas quelque chose du genre : « typeid( ((A*)0)->i ) ». Dans la mésure où l'expression paramètre d'un typeid n'est pas évaluée, il n'y a pas de comportement indéfini.
-- James Kanze GABI Software http://www.gabi-soft.fr Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Julien Lamy wrote:
Arnaud Debaene wrote:
Je voudrais récupérer les informations de RTTI d'un membre de
classe,
quelque chose du genre :
#include <typeinfo>
#include <iostream>
using namespace std;
struct A
{
int i;
};
int main()
{
const type_info& info=typeid(A::i);
cout<<info.name()<<endl;
}
Ceci ne compile pas. La seule solution que j'ai trouvé pour
l'instant,
c'est d'écrire typeid(A().i), mais ce n'est pas toujours
utilisable
(si A n'est pas default-constructible).
Y'a-t-il une autre solution, sachant que je ne peux pas mettre de
typedef dans A? Merci d'avance
A mon avis, il n'y a pas d'autre solution : l'expression A::i n'est
correcte que si i est un membre statique de A, ce qui n'est pas le
cas
dans ton exemple. A moins d'avoir un typeid(A().i), éventuellement
avec les bons paramètres du constructeur (l'expression n'est pas
évaluée, donc pas de problème de performances), je ne vois pas.
Pourquoi pas quelque chose du genre : « typeid( ((A*)0)->i ) ». Dans
la
mésure où l'expression paramètre d'un typeid n'est pas évaluée, il
n'y a
pas de comportement indéfini.
--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Je voudrais récupérer les informations de RTTI d'un membre de classe,
quelque chose du genre :
#include <typeinfo> #include <iostream> using namespace std;
struct A { int i; };
int main() { const type_info& info=typeid(A::i); cout<<info.name()<<endl; }
Ceci ne compile pas. La seule solution que j'ai trouvé pour l'instant,
c'est d'écrire typeid(A().i), mais ce n'est pas toujours utilisable
(si A n'est pas default-constructible).
Y'a-t-il une autre solution, sachant que je ne peux pas mettre de typedef dans A? Merci d'avance
A mon avis, il n'y a pas d'autre solution : l'expression A::i n'est correcte que si i est un membre statique de A, ce qui n'est pas le cas
dans ton exemple. A moins d'avoir un typeid(A().i), éventuellement avec les bons paramètres du constructeur (l'expression n'est pas évaluée, donc pas de problème de performances), je ne vois pas.
Pourquoi pas quelque chose du genre : « typeid( ((A*)0)->i ) ». Dans la mésure où l'expression paramètre d'un typeid n'est pas évaluée, il n'y a pas de comportement indéfini.
-- James Kanze GABI Software http://www.gabi-soft.fr Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Marc Boyer
Arnaud Debaene wrote:
Marc Boyer wrote:
Sur mon g++ -Wall -ansi, ça marche.
Ah? Ca ne marche ni sur Comeau Online ni sur VC 7.1
Que disent-ils ? En fait, je ne suis pas familier avec typeid. C'est l'affirmation de Julien sur la non-évaluation de son argument par typeid qui m'a fait proposer ce type de contruction que j'utilise pour la vérification de contraintes templates.
Là, ça devient des subtilités de C++ que je ne maîtrise pas.
Marc Boyer -- Je ne respecte plus le code de la route à vélo depuis une double fracture due au fait que j'étais le seul à le respecter.
Arnaud Debaene wrote:
Marc Boyer wrote:
Sur mon g++ -Wall -ansi, ça marche.
Ah? Ca ne marche ni sur Comeau Online ni sur VC 7.1
Que disent-ils ?
En fait, je ne suis pas familier avec typeid. C'est l'affirmation
de Julien sur la non-évaluation de son argument par typeid qui
m'a fait proposer ce type de contruction que j'utilise pour
la vérification de contraintes templates.
Là, ça devient des subtilités de C++ que je ne maîtrise pas.
Marc Boyer
--
Je ne respecte plus le code de la route à vélo depuis une double fracture
due au fait que j'étais le seul à le respecter.
Ah? Ca ne marche ni sur Comeau Online ni sur VC 7.1
Que disent-ils ? En fait, je ne suis pas familier avec typeid. C'est l'affirmation de Julien sur la non-évaluation de son argument par typeid qui m'a fait proposer ce type de contruction que j'utilise pour la vérification de contraintes templates.
Là, ça devient des subtilités de C++ que je ne maîtrise pas.
Marc Boyer -- Je ne respecte plus le code de la route à vélo depuis une double fracture due au fait que j'étais le seul à le respecter.
Marc Boyer
wrote:
Julien Lamy wrote:
Arnaud Debaene wrote: A mon avis, il n'y a pas d'autre solution : l'expression A::i n'est correcte que si i est un membre statique de A, ce qui n'est pas le cas
dans ton exemple. A moins d'avoir un typeid(A().i), éventuellement avec les bons paramètres du constructeur (l'expression n'est pas évaluée, donc pas de problème de performances), je ne vois pas.
Pourquoi pas quelque chose du genre : « typeid( ((A*)0)->i ) ». Dans la mésure où l'expression paramètre d'un typeid n'est pas évaluée, il n'y a pas de comportement indéfini.
Sauf si A::operator-> est privé par exemple.
Marc Boyer -- Je ne respecte plus le code de la route à vélo depuis une double fracture due au fait que j'étais le seul à le respecter.
kanze@gabi-soft.fr wrote:
Julien Lamy wrote:
Arnaud Debaene wrote:
A mon avis, il n'y a pas d'autre solution : l'expression A::i n'est
correcte que si i est un membre statique de A, ce qui n'est pas le
cas
dans ton exemple. A moins d'avoir un typeid(A().i), éventuellement
avec les bons paramètres du constructeur (l'expression n'est pas
évaluée, donc pas de problème de performances), je ne vois pas.
Pourquoi pas quelque chose du genre : « typeid( ((A*)0)->i ) ». Dans
la
mésure où l'expression paramètre d'un typeid n'est pas évaluée, il
n'y a
pas de comportement indéfini.
Sauf si A::operator-> est privé par exemple.
Marc Boyer
--
Je ne respecte plus le code de la route à vélo depuis une double fracture
due au fait que j'étais le seul à le respecter.
Arnaud Debaene wrote: A mon avis, il n'y a pas d'autre solution : l'expression A::i n'est correcte que si i est un membre statique de A, ce qui n'est pas le cas
dans ton exemple. A moins d'avoir un typeid(A().i), éventuellement avec les bons paramètres du constructeur (l'expression n'est pas évaluée, donc pas de problème de performances), je ne vois pas.
Pourquoi pas quelque chose du genre : « typeid( ((A*)0)->i ) ». Dans la mésure où l'expression paramètre d'un typeid n'est pas évaluée, il n'y a pas de comportement indéfini.
Sauf si A::operator-> est privé par exemple.
Marc Boyer -- Je ne respecte plus le code de la route à vélo depuis une double fracture due au fait que j'étais le seul à le respecter.
Marc Boyer
In article <41bf2d28$0$3792$, Arnaud Debaene wrote:
Marc Boyer wrote:
Sur mon g++ -Wall -ansi, ça marche.
Ah? Ca ne marche ni sur Comeau Online ni sur VC 7.1
Perdu, ça marche avec Comeau Online.
Marc Boyer -- Je ne respecte plus le code de la route à vélo depuis une double fracture due au fait que j'étais le seul à le respecter.
In article <41bf2d28$0$3792$636a15ce@news.free.fr>, Arnaud Debaene wrote:
Marc Boyer wrote:
Sur mon g++ -Wall -ansi, ça marche.
Ah? Ca ne marche ni sur Comeau Online ni sur VC 7.1
Perdu, ça marche avec Comeau Online.
Marc Boyer
--
Je ne respecte plus le code de la route à vélo depuis une double fracture
due au fait que j'étais le seul à le respecter.
In article <41bf2d28$0$3792$, Arnaud Debaene wrote:
Marc Boyer wrote:
Sur mon g++ -Wall -ansi, ça marche.
Ah? Ca ne marche ni sur Comeau Online ni sur VC 7.1
Perdu, ça marche avec Comeau Online.
Marc Boyer -- Je ne respecte plus le code de la route à vélo depuis une double fracture due au fait que j'étais le seul à le respecter.
Arnaud Debaene
wrote:
Pourquoi pas quelque chose du genre : « typeid( ((A*)0)->i ) ». Dans la mésure où l'expression paramètre d'un typeid n'est pas évaluée, il n'y a pas de comportement indéfini.
J'ai trouvé une solution que je peux me permettre dans mon contexte (déclaration au sein d'une macro) :
static A MakeA(); //pas implémenté typeid(MakeA().i)
Merci
Arnaud
kanze@gabi-soft.fr wrote:
Pourquoi pas quelque chose du genre : « typeid( ((A*)0)->i ) ». Dans
la
mésure où l'expression paramètre d'un typeid n'est pas évaluée, il
n'y a
pas de comportement indéfini.
J'ai trouvé une solution que je peux me permettre dans mon contexte
(déclaration au sein d'une macro) :
static A MakeA(); //pas implémenté
typeid(MakeA().i)
Pourquoi pas quelque chose du genre : « typeid( ((A*)0)->i ) ». Dans la mésure où l'expression paramètre d'un typeid n'est pas évaluée, il n'y a pas de comportement indéfini.
J'ai trouvé une solution que je peux me permettre dans mon contexte (déclaration au sein d'une macro) :
static A MakeA(); //pas implémenté typeid(MakeA().i)
Merci
Arnaud
kanze
Marc Boyer wrote:
wrote:
Julien Lamy wrote:
Arnaud Debaene wrote: A mon avis, il n'y a pas d'autre solution : l'expression A::i n'est
correcte que si i est un membre statique de A, ce qui n'est pas le cas dans ton exemple. A moins d'avoir un typeid(A().i), éventuellement avec les bons paramètres du constructeur (l'expression n'est pas évaluée, donc pas de problème de performances), je ne vois pas.
Pourquoi pas quelque chose du genre : « typeid( ((A*)0)->i ) ». Dans
la mésure où l'expression paramètre d'un typeid n'est pas évaluée,
il n'y a pas de comportement indéfini.
Sauf si A::operator-> est privé par exemple.
Quel rapport ? Je n'appelle pas -> sur un A, mais sur un A*. Un A::operator-> éventuel n'a aucune influence.
-- James Kanze GABI Software http://www.gabi-soft.fr Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Marc Boyer wrote:
kanze@gabi-soft.fr wrote:
Julien Lamy wrote:
Arnaud Debaene wrote:
A mon avis, il n'y a pas d'autre solution : l'expression A::i
n'est
correcte que si i est un membre statique de A, ce qui n'est pas le
cas dans ton exemple. A moins d'avoir un typeid(A().i),
éventuellement avec les bons paramètres du constructeur
(l'expression n'est pas évaluée, donc pas de problème de
performances), je ne vois pas.
Pourquoi pas quelque chose du genre : « typeid( ((A*)0)->i ) ».
Dans
la mésure où l'expression paramètre d'un typeid n'est pas
évaluée,
il n'y a pas de comportement indéfini.
Sauf si A::operator-> est privé par exemple.
Quel rapport ? Je n'appelle pas -> sur un A, mais sur un A*. Un
A::operator-> éventuel n'a aucune influence.
--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Arnaud Debaene wrote: A mon avis, il n'y a pas d'autre solution : l'expression A::i n'est
correcte que si i est un membre statique de A, ce qui n'est pas le cas dans ton exemple. A moins d'avoir un typeid(A().i), éventuellement avec les bons paramètres du constructeur (l'expression n'est pas évaluée, donc pas de problème de performances), je ne vois pas.
Pourquoi pas quelque chose du genre : « typeid( ((A*)0)->i ) ». Dans
la mésure où l'expression paramètre d'un typeid n'est pas évaluée,
il n'y a pas de comportement indéfini.
Sauf si A::operator-> est privé par exemple.
Quel rapport ? Je n'appelle pas -> sur un A, mais sur un A*. Un A::operator-> éventuel n'a aucune influence.
-- James Kanze GABI Software http://www.gabi-soft.fr Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Arnaud Debaene
Marc Boyer wrote:
In article <41bf2d28$0$3792$, Arnaud Debaene wrote:
Perdu, ça marche avec Comeau Online.
?? Le code exact que j'ai posté (copié-collé) me donne :
Comeau C/C++ 4.3.3 (Aug 6 2003 15:13:37) for ONLINE_EVALUATION_BETA1 Copyright 1988-2003 Comeau Computing. All rights reserved. MODE:strict errors C++
"ComeauTest.c", line 12: error: a nonstatic member reference must be relative to a specific object const type_info& info=typeid(A::i); ^ 1 error detected in the compilation of "ComeauTest.c".
Arnaud
Marc Boyer wrote:
In article <41bf2d28$0$3792$636a15ce@news.free.fr>, Arnaud Debaene
wrote:
Perdu, ça marche avec Comeau Online.
?? Le code exact que j'ai posté (copié-collé) me donne :
Comeau C/C++ 4.3.3 (Aug 6 2003 15:13:37) for ONLINE_EVALUATION_BETA1
Copyright 1988-2003 Comeau Computing. All rights reserved.
MODE:strict errors C++
"ComeauTest.c", line 12: error: a nonstatic member reference must be
relative to a
specific object
const type_info& info=typeid(A::i);
^
1 error detected in the compilation of "ComeauTest.c".
In article <41bf2d28$0$3792$, Arnaud Debaene wrote:
Perdu, ça marche avec Comeau Online.
?? Le code exact que j'ai posté (copié-collé) me donne :
Comeau C/C++ 4.3.3 (Aug 6 2003 15:13:37) for ONLINE_EVALUATION_BETA1 Copyright 1988-2003 Comeau Computing. All rights reserved. MODE:strict errors C++
"ComeauTest.c", line 12: error: a nonstatic member reference must be relative to a specific object const type_info& info=typeid(A::i); ^ 1 error detected in the compilation of "ComeauTest.c".