adebaene@club-internet.fr Guest
|
Posted: Mon Mar 14, 2005 10:58 am Post subject: Passer d'un typeid à un template <typename T> |
|
|
Bonjour,
Je suis en train d'écrire un petit framework simple d'introspection de
type. Dans ce cadre, j'ai un classe PropDescriptorIterator qui, pour
simplifier, à la signature suivante:
class PropDescriptorIterator
{
public:
PropDescriptorIterator(Object* object_to_iterate_on);
PropDescriptorIterator& operator++();
PropDescriptorIterator& operator++(int);
//... autres opérateurs pour faire un itérateur
const std::type_info* GetType() const; //type de la propriété
courante
std::string GetPropName() const; //nom de la propriété courante
template <typename T> T GetValue() const; //récupère la valeur de
la propriété courante. Lève une exception si T ne correpond pas à
GetType().
};
Je vous passe les détails d'implémentation, mais l'idée est de
pouvoir itérer sur les "propriétés" d'un objet donné (en fait, des
données membres), de récupérer leur nom, leur type et leur valeur.
La liste des "propriétés" d'un type est définie dans le type en
question. Ce code fonctionne bien.
Mon problème maintenant, c'est de pouvoir écrire quelque chose du
genre:
PropDescriptorIterator it=MonObjet.begin();
while (it!=MonObjet.end())
cout<
NB : begin et end sont correctement définis dans MonObjet et renvoient
les itérateurs "bornes" de ses propriétés.
Bien entendu, ce code ne compile pas car le compilateur ne peut pas
déduire le type de it.GetValue(). J'ai bien une description du type de
ma propriété courante via it.GetType(), mais je n'arrive pas à faire
le lien avec un appel template à GetValue. Est ce que quelqu'un aurait
une idée?
La seule approche que je voie pour l'instant, c'est de rajouter une
méthode "GetValueAsString" à PropDescriptorIterator, mais ca ne me
plait pas trop.
Merci d'avance pour tout idée.
Arnaud
|
|