dans le concept, c'est dommage que les propriétés ne soient pas de reelles propriétés mais les valeurs. Tu essayes de faire du RTTI mais le concept de RTTI est souvent :
- il y a des classes (RTTIClass)
- des proprietes (RTTIProperty)
- (optionnel) des methodes (RTTIMethod) finalement assez proche des proprietes
Pour chaque classe C++ qui a un RTTI, il existe une instance de RTTIClass, laquelle contient des RTTIProperty et des RTTIMethod
une RTTIProperty ne contient aucune valeur, mais permet de retrouver la valeur quand on lui donne une instance, de sorte que meme sans instance, tu peux acceder aux proprietes (mais pas aux valeurs)
soit :
1 2 3 4 5 6 7 8 9 10 11
| CClient
{
static RTTIClass s_metaclass;
int m_memberInt;
public:
static const RTTIClass* metaclass;
CClient();
};
RTTIClass CClient::s_metaclass("CClient", RTTIProperty<CClient,int>(offsetof(CClient::m_memberInt)); // TODO : si tu as de l'heritage, les metaclasses doivent avoir cette notion d'heritage
RTTIClass* CClient::metaclass = &CClient::s_metaclass; |
c'est un exemple evidemment de syntaxe, ca pourrait etre different (ca devrait)
ensuite, pour recuperer une proprieté, tu passes par
IProperty* p = CClient::metaclass->getProperty("name"); //pas d'instance
et enfin, pour recuperer la valeur :
p->as<int>()->getValue(instance);
c'est comme ca que la plupart des langages avec introspection fonctionnent, et tu pourrais meme faire un pont entre C# (mono) et ton RTTI ou encore python ou lua, car ils utilisent les memes concepts (tu aurais un mapping presque parfait entre leur RTTI et le tiens)
Partager