Tu as une class B héritant du class A :
* Si camp::class est celle pour A et tu as une instance de b : camp::class te permet d'accéder au metada définie pour A et non pour B.
* Si camp::class est celle pour B et tu as une instance de b : camp::class te permet d'accéder au metada définie pour B et non pour A.
La meta-classe de B ayant hérité de la meta-classe de A, dans le second cas tu auras bien accès aux meta-informations de A et de B pour ton objet b. Ici le comportement est strictement le même que celui du C++ vis-à-vis de l'héritage.
Tu as besoin de récupérer un camp::class compatible pour pouvoir manipuler une instance précise et donc connaitre sa nature (c'est un A, un B ou un C).
Tout comme un QObject* vient bien d'un objet dont le compilo connaît le type statique, si on remonte suffisamment loin. Là où tu commences à manipuler des QObject* pour t'abstraire du type des objets, tu peux manipuler des camp::Object. C'est pareil, l'association entre l'objet réel et sa partie abstraite est simplement faite différemment : dans Qt celle-ci est incluse dans l'objet via sa base QObject, dans CAMP elle lui est associée de manière externe à la compilation via des classes de traits.
J'ai l'impression que je pourrais avec un camp::class pour C essayer de l'appliquer sur une instance de A ou B sans que cela empêche de compiler.
En effet, tu pourrais et tu obtiendrais une exception. Mais ça c'est juste un détail, l'API publique permet de faire beaucoup de choses mais en utilisation normale tout est fait pour que ça n'arrive pas. D'ailleurs l'API publique nécessiterait encore quelques améliorations dans ce sens ; mais là encore, il n'y a aucun problème technique à le faire, c'est juste un arrangement des classes et fonctions qu'on fournit à l'utilisateur.
Je ne suis pas sure qu'à partir de l'instance tu peut trouver le camp::class le plus adapté
Si c'est possible
const camp::Class& derived = camp::classByObject(a); // récupère B
la plupart des générateurs de makefile le font pour toi.
Tout le monde ne travaille pas avec un générateur de makefile. Pour Visual Studio par exemple, il faut un plugin qui nécessite d'avoir une licence commerciale de Qt, si je ne m'abuse. Pour Code::Blocks c'est même pas en rêve je suppose, il faut passer par un makefile MinGW.
Mais la version avec CAMP me parait beaucoup plus dure à comprendre que celle avec un superObject.
Problème d'interface publique pas encore totalement au point, là c'est encore un peu "brut"
Le fait est qu'on peut toujours construire sa propre abstraction par dessus ces composants de base (signaux/slots, metaclasses, ...), et que techniquement le QObject en tant que base de tout le reste est toujours inutile.
CAMP est prévue pour être statique (vérif à la compilation) alors que Qt est prévue pour être dynamique (vérif à l'exécution). Ce qui est plutôt complémentaire, l'un permet des choses que l'autre ne peut pas.
Les deux sont prévues pour être dynamiques. CAMP peut simplement faire quelques tests de manière statique car il utilise la meta-programmation et garde des informations de typage fort assez longtemps dans le processus interne.
Partager