J'ai une hiérarchie de types - GenericClass et un certain nombre de classes dérivées, InterestingDerivedClass inclus, GenericClass est polymorphe. Il y a une interfaceExiste-t-il un moyen plus rapide de détecter le type d'objet lors de l'exécution que d'utiliser dynamic_cast?
interface ICallback {
virtual void DoStuff(GenericClass*) = 0;
};
que j'ai besoin de mettre en œuvre. Ensuite, je veux détecter le cas lorsque le pointeur GenericClass * passé dans ICallback :: DoStuff() est vraiment un pointeur vers InterestingDerivedClass:
class CallbackImpl : public ICallback {
void DoStuff(GenericClass* param) {
if(dynamic_cast<InterestingDerivedClass*>(param) != 0) {
return; //nothing to do here
}
//do generic stuff
}
}
Le GenericClass et les classes dérivées sont hors de mon contrôle, je contrôle seulement le CallbackImpl .
J'ai chronométré l'instruction dynamic_cast - il faut environ 1400 cycles ce qui est acceptable pour l'instant, mais ne semble pas très rapide. J'ai essayé de lire le désassemblage de ce qui est exécuté pendant dynamic_cast dans le débogueur et vu qu'il prend beaucoup d'instructions.
Puisque je n'ai pas vraiment besoin du pointeur vers la classe dérivée, y a-t-il une manière plus rapide de détecter le type d'objet à l'exécution en utilisant seulement RTTI? Peut-être une méthode spécifique à l'implémentation qui vérifie uniquement la relation "est un" mais ne récupère pas le pointeur?
Similaire à http://stackoverflow.com/questions/500493/c-equivalent-of-instanceof –