Par souci de clarté:
Je voulais éviter dynamic_cast
car il est une distribution de temps d'exécution.
Eh bien, vous avez un type d'exécution (avec une référence statiquement typé à la classe de base, vous ne pouvez pas généralement connaître le type dynamique de l'objet), donc un casting d'exécution est la seule option totalement sûre.
Si vous pensiez que votre objet était vraiment un Bar
, mais trompiez, dynamic_cast<Bar*>
vous donnera un nullptr
, ou dynamic_cast<Bar&>
lèveront une exception. De toute façon, vous avez une chance de gérer votre erreur d'exécution au moment de l'exécution. Comme l'a souligné M.M, ceci n'est disponible que si votre classe de base possède ou hérite d'au moins une méthode virtuelle.
Maintenant, si, par hasard, vous pouvez être statiquement certain type dynamique de votre objet vraiment estBar
, vous pouvez utiliser static_cast
. Cependant, si vous vous trompez, vous avez un comportement indéterminé et aucune opportunité de détecter ou de gérer l'erreur.
par ex.
struct Foo { virtual ~Foo(){} };
struct Bar : public Foo {};
// safe, may return nullptr
Bar* safe_ptr_cast(Foo *f) { return dynamic_cast<Bar*>(f); }
// safe, may throw but you can catch it
Bar& safe_ref_cast(Foo &f) { return dynamic_cast<Bar&>(f); }
// unsafe - if you're wrong, you just broke everything
Bar* unsafe_ptr_cast(Foo *f) { return static_cast<Bar*>(f); }
Par ailleurs, si votre problème avec la distribution de temps d'exécution est la performance, au risque UB afin de gagner du temps notionnel avant d'avoir le code de profil est la définition de l'optimisation prématurée.
C'est quelque chose que vous devriez éviter, faire ce genre de choses sont des signes de problèmes de conception. Si vous pensez que vous en avez vraiment besoin, vous pouvez comparer les typesid-s des classes, et si cela correspond, vous pouvez static_cast le pointeur ...c'est beaucoup plus rapide qu'un dynamic_cast, mais ça ne marchera pas si vous ne connaissez pas la classe de destination exacte. – Melkon
@Melkon comment vérifier typeid plus vite que dynamic_cast? Quel compilateur et quels paramètres avez-vous vu? –
@MarkRansom: la vérification de typeid ne traversera pas la hiérarchie des classes. – Melkon