Tenemos un subproyecto 'commonUtils' que tiene muchos fragmentos de código genéricos utilizados en el proyecto principal. Una de estas cosas interesantes que vi fue: -Pruebe si una clase es polimórfica
/*********************************************************************
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;
}
yo creía que el comentario y pensé que es bastante una plantilla interesante aunque no es utilizado en todo el proyecto. Intenté usarlo así solo por curiosidad ...
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";
Pero ninguno de esos resultados alguna vez es cierto. MSVC 2005 no da advertencias, pero Comeau advierte que la expresión de tipo no tiene ningún efecto. La sección 5.2.8 en el estándar de C++ no dice nada como lo que dice el comentario, es decir, que typeid se evalúa en tiempo de compilación para tipos no polimórficos y en tiempo de ejecución para tipos polimórficos.
1) Así que supongo que el comentario es engañoso/simplemente incorrecto o dado que el autor de este código es un programador de C++ bastante avanzado, ¿me falta algo?
2) OTOH, me pregunto si podemos probar si una clase es polimórfica (tiene al menos una función virtual) usando alguna técnica?
3) ¿Cuándo querría saber si una clase es polimórfica? Conjetura salvaje; para obtener la dirección de inicio de una clase usando dynamic_cast<void*>(T)
(como dynamic_cast
funciona solo en clases polimórficas).
A la espera de sus opiniones.
Gracias de antemano,
Er, Si el autor es un programador senior de C++, ¿por qué no consultar con él primero? ... A menudo aprenderás mucho de muchachos experimentados. – stefanB
Bueno, si pudiera, no lo habría preguntado en stackoverflow :-) – Abhay