OVH Cloud OVH Cloud

typeid sur une membre de classe

12 réponses
Avatar
adebaene
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

Arnaud

10 réponses

1 2
Avatar
Julien Lamy
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.

Avatar
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;

struct A
{
int i;
};

int main()
{


A& makeA();

const type_info& info=typeid(makeA().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


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.

Avatar
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

Avatar
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


Avatar
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.


Avatar
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.


Avatar
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.


Avatar
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

Avatar
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



Avatar
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

1 2