Получить тип переменной
Вопрос
Если я правильно понимаю, TypeID может определить фактический тип полиморфизма, в то время как TypeOF не может.
Также ли это правда, что их возвраты используются для разных целей: возврат типа используется в качестве ключевого слова типа, который может определить переменную, но возврат TypeID не может?
Есть ли способ получить фактический тип для полиморфизма и использовать ключевое слово return в качестве типа для определения другой переменной? Я надеюсь получить полученный тип класса из указателя, указывающего на базовый класс и определить переменную или указатель на полученный класс. Что-то типа:
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
Большое спасибо!
Решение
C ++ 0x буду иметь decltype
который можно использовать так:
int someInt;
decltype(someInt) otherIntegerVariable = 5;
Но для простого старого C ++, к сожалению, нет.
Я полагаю, что decltype
На самом деле тоже не будет большой помощи, так как вы хотите полиморфный тип, нет объявленный тип. Самый простой способ сделать то, что вы хотите, - это попытаться динамично поднять на определенный тип и проверить на наличие 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
}
}
Другие советы
Предполагая иерархию 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();
}
Где afunc, bfunc, cfunc специфичны для их соответствующих классов, а не виртуально. Очевидно, это может быть несколько оптимизировано.