Abbiamo un sottoprogetto "commonUtils" che ha molti snippet di codice generici utilizzati nel progetto principale. Una di queste cose interessanti che ho visto era: -Verificare se una classe è polimorfica
/*********************************************************************
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;
}
ho creduto il commento e ho pensato che è piuttosto un modello interessante anche se non è utilizzato in tutto il progetto. Ho provato ad usarlo in questo modo solo per 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";
Ma nessuno di quelli restituisce mai vero. MSVC 2005 non dà avvisi ma Comeau avverte che l'espressione di tipo non ha alcun effetto. La sezione 5.2.8 nello standard C++ non dice nulla di simile a ciò che il commento dice che il typeid è valutato al momento della compilazione per i tipi non polimorfici e al runtime per i tipi polimorfici.
1) Quindi immagino che il commento sia fuorviante/errato o che l'autore di questo codice sia un programmatore C++ piuttosto anziano, mi manca qualcosa?
2) OTOH, mi chiedo se possiamo verificare se una classe è polimorfica (ha almeno una funzione virtuale) utilizzando una tecnica?
3) Quando si vorrebbe sapere se una classe è polimorfica? Ipotesi selvaggia; per ottenere l'indirizzo iniziale di una classe utilizzando dynamic_cast<void*>(T)
(come dynamic_cast
funziona solo su classi polimorfiche).
In attesa di pareri.
Grazie in anticipo,
E, se l'autore è un programmatore C++ senior, perché non lo controlli prima con lui? ... Spesso imparerai molto dai ragazzi esperti. – stefanB
Beh, se potessi non lo avrei chiesto su StackOverflow :-) – Abhay