Obtenha o tipo de variável
Pergunta
Se bem entendi, typeid pode determinar o tipo real no polimorfismo, enquanto typeof não pode.
Também é verdade que seus retornos são utilizados para finalidades diferentes:o retorno de typeof é usado como palavra-chave de tipo que pode definir variável, mas o retorno de typeid não pode?
Existe alguma maneira de obter o tipo real do polimorfismo e usar a palavra-chave return as type para definir outra variável?Espero obter o tipo de classe derivada de um ponteiro apontando para a classe base e definir uma variável ou um ponteiro para a classe derivada.Algo 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
Muito obrigado!
Solução
c++0x terá decltype
que pode ser usado assim:
int someInt;
decltype(someInt) otherIntegerVariable = 5;
mas para o velho c++, infelizmente, não.
eu suponho que decltype
também não ajudará muito, já que você deseja o tipo polimórfico, não o tipo declarado.A maneira mais direta de fazer o que você deseja é tentar fazer uma conversão dinâmica para um tipo específico e verificar se há 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
}
}
Outras dicas
Assumindo uma hierarquia 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();
}
Onde AFunc, BFunc, CFunc são específicos para suas respectivas classes, e não virtuais.Obviamente, isso pode ser otimizado um pouco.