Вопрос

Если я правильно понимаю, 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 специфичны для их соответствующих классов, а не виртуально. Очевидно, это может быть несколько оптимизировано.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top