Wir haben ein Unterprojekt 'commonUtils', das viele generische Code-Snippets im übergeordneten Projekt verwendet. i Eine solche interessante Sachen sah, war: -Testen Sie, ob eine Klasse polymorph ist
/*********************************************************************
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;
}
ich den Kommentar geglaubt und dachte, dass es eine sehr interessante Vorlage ist, obwohl es nicht über das Projekt verwendet wird. Ich habe versucht, es nur aus Neugier so zu verwenden ...
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";
Aber keines von denen kehrt jemals zurück. MSVC 2005 gibt keine Warnungen, aber Comeau warnt, dass typeid Ausdruck keine Auswirkung hat. Abschnitt 5.2.8 im C++ - Standard sagt nichts darüber aus, was der Kommentar sagt, d. H. Typid is wird zur Kompilierungszeit für nicht-polymorphe Typen und zur Laufzeit für polymorphe Typen ausgewertet.
1) Also ich denke, der Kommentar ist irreführend/plain-falsch oder da der Autor dieses Codes ist ziemlich ein Senior C++ - Programmierer, fehlt mir etwas?
2) OTOH, ich frage mich, ob wir testen können, ob eine Klasse polymorph ist (hat mindestens eine virtuelle Funktion) mit einer Technik?
3) Wann möchte man wissen, ob eine Klasse polymorph ist? Wilde Vermutung; Um die Startadresse einer Klasse zu erhalten, verwenden Sie dynamic_cast<void*>(T)
(wie dynamic_cast
funktioniert nur auf polymorphe Klassen).
In Erwartung Ihrer Meinungen.
Vielen Dank im Voraus,
Er, Wenn der Autor ein älterer C++ - Programmierer ist, warum überprüfen Sie nicht zuerst mit ihm? ... Sie werden oft viel von erfahrenen Leuten lernen. – stefanB
Nun, wenn ich könnte ich hätte es nicht auf stackoverflow gefragt :-) – Abhay