Salut,
je cherche à tester si un objet possède un attribut... afin de différencier une certaine sous-classe
je ne vois pas trop comment le faire en C++![]()
Tester si un attribut est présent, rien de direct pour ça. Et même en moins direct, rien en restant dans la langage. Le C++ est très limité en terme d'introspection. Par contre, différentier une sous-classe peut se faire à l'aide de dynamic_cast, même si en général on préfère éviter d'avoir à différentier une sous classe.
Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.
Montre ce que tu as fait, là comme ça, j'ai du mal à deviner ce qui cloche...
Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.
Le seul moyen que je vois de tester dynamiquement si une classe possède un membre, c'est de contraindre ce membre à être hérité virtuellement. Mais le problème suggèrera peut-être une autre solution.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 struct AttributOwner { int attr; }; class B {...} struct X: B, virtual AttributOwner {...}; struct Y : B, virtual AttributOwner {...}; B* ptr; if (dynamic_cast<AttributOwner*>(ptr) != 0) { ... }
Une solution qui parraitrait envisageable ne serait-ce pas de rajouter un membre à la classe (par exemple un booleen HasMember, en protected) qui aurait, par défaut la valeur false, sauf justement, pour les sous classes qui auraient ce membre
Tu pourrait alors gérer ton membre sous la forme de
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 if(HasMember) { //traiter le membre } // peut etre un autre traitement, s'il n'y est pas else { //autre traitement }
A méditer: La solution la plus simple est toujours la moins compliquée
Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
Compiler Gcc sous windows avec MinGW
Coder efficacement en C++ : dans les bacs le 17 février 2014
mon tout nouveau blog
<parenthèse>
Avec la méta prog, on peut sortir le SFINAE pour détecter la présence d'un membre dans une classe.
Mais cela suppose:
- un compilo très très récent, et non buggué de préférence (surtout quand le membre est un opérateur)
- que tu connaisses déjà le type exact de ton objet -- pas ton cas visiblement, sinon tu aurais pu utiliser directement le dynamic_cast.
</>
Te voyant parti dans des hiérarchies, il est probable que tu prennes ton problème à l'envers. Tu pourrais nous en dire plus sur la tête de tes hiérarchies ? si tu peux les altérer (pour appliquer la solution de Jean-Marc) ? Peux-tu rajouter des accesseurs virtuels partiellement définis ? Qu'est-ce qui doit être résolu au final ?
Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...
Partager