Il y a longtemps que je l'ai créé un modèle suivant pour que je sois un assert chaque fois que je joue un static_cast mais le type est pas ce que je suppose qu'il soit:Contrôlé fonte statique sur une référence
/// perform a static_cast asserted by a dynamic_cast
template <class Type, class SourceType>
Type static_cast_checked(SourceType item)
{
Assert(!item || dynamic_cast<Type>(item));
return static_cast<Type>(item);
}
Aujourd'hui, je voulais pour créer une variante qui ne fonctionnerait pas seulement avec des pointeurs, mais avec des références ainsi:
/// overload for reference
template <class Type, class SourceType>
Type &static_cast_checked(SourceType &item)
{
Assert(dynamic_cast<Type *>(&item));
return static_cast<Type>(item);
}
Cependant, le compilateur ne semble pas utiliser cette surcharge lorsque je cASTING une référence à une autre référence. J'ai peur de ne pas comprendre suffisamment les règles de résolution des templates pour comprendre pourquoi ou pour créer une variante qui fonctionne.
Remarque: Je ne peux pas attraper le bad_cast exception
au lieu de vérifier dynamic_cast<Type *>
pour NULL, les exceptions étant désactivées pour ce projet.
Pouvez-vous ajouter une surcharge pour '' SourceType * et retirer l'original? Avez-vous besoin de prendre en charge des types de valeur du tout? (Et est-ce que cela corrige le problème, je me demande maintenant?) –
J'ai pensé à ces lignes de code, et je ne peux pas comprendre pourquoi cela est nécessaire. Si vous vérifiez un casting statique avec un casting dynamique, seuls les objets peuvent être vérifiés statiquement casted avec castable dynamique. Cela signifie qu'il s'agit d'une réimplantation de 'dynamic_cast'. La différence entre la distribution dynamique et statique est que la distribution dynamique examine le vtable et le statique non. – nutario
Il s'agit d'un cast statique, mais qui affirme - c'est-à-dire que vous notifiez le débogage que votre hypothèse sur le type que vous lancez est fausse. – Suma