Получите тип переменной

Если я понимаю правильно, идентификатор типа может определить фактический тип в полиморфизме, в то время как typeof не может.

Это также верный, что их возвраты используются в различных целях: возврат typeof используется в качестве ключевого слова типа, которое может определить переменную, но возврат идентификатора типа не может?

Там какой-либо путь состоит в том, чтобы оба получить фактический тип для полиморфизма и использовать возврат в качестве ключевого слова типа для определения другой переменной? Я надеюсь получить тип производного класса от указателя, указывающего на базовый класс и определить переменную или указатель на производный класс. Что-то как:

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

Большое спасибо!

5
задан Tim 31 December 2009 в 22:04
поделиться

2 ответа

Это действительно очень неясное объяснение, а алгоритм, похоже, не происходит из любого из перечисленных ссылок.

Идея, похоже, должна сначала сделать случайное путь, выбрав начальный узел случайным образом и исходя из этого, выбрав случайных соседей до тех пор, пока это возможно. Когда больше никаких соседей не может быть выбрана, либо путь является гамильтонианом, либо не так. Если это не так, это последний узел на пути имеет какой-то сосед уже на пути (см. Ниже), поэтому поворот означает сделать край от последнего узла к соседу уже на пути и удалять одну из ссылок из сосед, который был выбран для пути. Затем есть новый конец пути, из которого процесс продолжен.

Кажется, этот алгоритм предполагает, например, что нет узлов с одним краем. Это легко покрывать, хотя: если есть один из них, просто начните с этого, если есть два, начните с одного из них и попытаться в конечном итоге на другом, и если есть более двух, не может быть гамильтоновый путь.

-121--3665417-

C ++ 0x будет иметь DECLTYPE , который можно использовать следующим образом:

int someInt;
decltype(someInt) otherIntegerVariable = 5;

, но для простого старого C ++, к сожалению, нет.

Я полагаю, что DELLTYPE не будет много помощи, хотя, поскольку вы хотите полиморфный тип, не заявленный тип. Самый прямой способ сделать то, что вы хотите, - это попытаться динамично отбрасывать к определенному типу и проверять 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
    }
}
7
ответ дан 13 December 2019 в 22:09
поделиться

, предполагая иерархию 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();
}

Where AFunc, BFunc, CFunc специфичны для их соответствующих классов, а не виртуальны. Очевидно, что это можно несколько оптимизировать.

.
3
ответ дан 13 December 2019 в 22:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: