Nous avons un sous-projet 'commonUtils' qui contient de nombreux extraits de code génériques utilisés dans le projet parent. L'une de ces choses intéressantes, j'ai vu était: -Tester si une classe est polymorphe
/*********************************************************************
If T is polymorphic, the compiler is required to evaluate the typeid
stuff at runtime, and answer will be true. If T is non-polymorphic,
the compiler is required to evaluate the typeid stuff at compile time,
whence answer will remain false
*********************************************************************/
template <class T>
bool isPolymorphic() {
bool answer=false;
typeid(answer=true,T());
return answer;
}
Je croyais le commentaire et je pensais qu'il est tout à fait un modèle intéressant qu'il ne soit pas utilisé à travers le projet. J'ai essayé de l'employer comme ceci juste pour la curiosité ...
class PolyBase {
public:
virtual ~PBase(){}
};
class NPloyBase {
public:
~NBase(){}
};
if (isPolymorphic<PolyBase>())
std::cout<<"PBase = Polymorphic\n";
if (isPolymorphic<NPolyBase>())
std::cout<<"NBase = Also Polymorphic\n";
Mais aucun de ceux jamais retourne vrai. MSVC 2005 ne donne aucun avertissement mais Comeau prévient que l'expression typée n'a aucun effet. Section 5.2.8 dans la norme C++ ne dit rien comme ce que dit le commentaire, c'est-à-dire que typeid est évalué au moment de la compilation pour les types non-polymorphes et à l'exécution pour les types polymorphes.
1) Donc je suppose que le commentaire est trompeur/plaine-faux ou puisque l'auteur de ce code est un programmeur C++ assez sénior, ai-je manqué quelque chose?
2) OTOH, je me demande si nous pouvons tester si une classe est polymorphe (a au moins une fonction virtuelle) en utilisant une technique?
3) Quand voudrait-on savoir si une classe est polymorphe? Wild devinez; pour obtenir l'adresse de début d'une classe en utilisant dynamic_cast<void*>(T)
(comme dynamic_cast
fonctionne uniquement sur les classes polymorphes).
En attente de vos avis.
Merci à l'avance,
Er, Si l'auteur est un programmeur C++ senior, pourquoi ne pas vérifier avec lui en premier? ... Vous apprendrez souvent beaucoup de gars expérimentés. – stefanB
Eh bien, si je pouvais je ne l'aurais pas demandé sur stackoverflow :-) – Abhay