Obtener tipo de variables
Pregunta
Si he entendido bien, typeid puede determinar el tipo real de polimorfismo, mientras typeof no puede.
¿Es cierto también que sus declaraciones se utilizan para diferentes propósitos: el regreso de typeof se utiliza como palabra clave que puede definir el tipo variable, pero el retorno de typeid no puede
?¿Hay alguna manera de conseguir tanto el tipo real de polimorfismo y utilizar el retorno como tipo de palabra clave para definir otra variable? Espero conseguir el tipo de clase derivada de un puntero que apunta a la clase base y definir una variable o un puntero a la clase derivada. Algo así como:
baseclass *p = new derivedclass
typexxx(*p) *pp = dynamic_cast<typexxx(*p) *> (p);
// would like to convert the pointer from pointing to a base class
// to its derived class
Muchas gracias!
Solución
c ++ 0x tendrá decltype
que se puede utilizar como este :
int someInt;
decltype(someInt) otherIntegerVariable = 5;
pero para el viejo y simple C ++, por desgracia, no.
supongo que decltype
realidad no va a ser de mucha ayuda, aunque ya que desea que el tipo polimórfico, no el tipo declarado. La forma recta hacia adelante más que hacer lo que quiere es intentar dinámico reparto a un tipo particular y comprobar si hay NULL
.
struct A {
virtual ~A() {}
};
struct B : public A {};
struct C : public A {};
int main() {
A* x = new C;
if(B* b_ptr = dynamic_cast<B*>(x)) {
// it's a B
} else if(C* c_ptr = dynamic_cast<C*>(x)) {
// it's a C
}
}
Otros consejos
Suponiendo una jerarquía A <- B <- C
A * p = new AorBorC; // create new object of some sort
if ( dynamic_cast <C*>(p) ) {
C * c = dynamic_cast <C*>(p);
c->CFunc();
}
else if ( dynamic_cast <B*>(p) ) {
B * b = dynamic_cast <B*>(p);
b->BFunc();
}
else if ( dynamic_cast <A*>(p) ) {
A * a = dynamic_cast <A*>(p);
a->AFunc();
}
Cuando AFunc, BFunc, CFunc son específicos de sus respectivas clases y no virtual. Obviamente, esto puede ser optimizado en cierta medida.