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
In article <41c0ae4b$0$11233$, Arnaud Debaene wrote:
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".
Parce que tu n'as pas vu la deuxième modif que j'avais faite au code const type_info& info=typeid(makeA().i);
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 <41c0ae4b$0$11233$626a14ce@news.free.fr>, Arnaud Debaene wrote:
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".
Parce que tu n'as pas vu la deuxième modif que j'avais
faite au code
const type_info& info=typeid(makeA().i);
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 <41c0ae4b$0$11233$, Arnaud Debaene wrote:
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".
Parce que tu n'as pas vu la deuxième modif que j'avais faite au code const type_info& info=typeid(makeA().i);
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:
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.
Oups, je me suis trompé en effet.
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:
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.
Oups, je me suis trompé en effet.
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.
Quel rapport ? Je n'appelle pas -> sur un A, mais sur un A*. Un A::operator-> éventuel n'a aucune influence.
Oups, je me suis trompé en effet.
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.