О типе decltype в объектно-ориентированном в c ++ - PullRequest
0 голосов
/ 06 мая 2018

У меня есть пример на c ++ о oop и decltype:

class parent {

};

class child : public parent {

};

int main()
{
    parent * p = new child;
    decltype(*p) c = *p;
}

В приведенном выше коде тип c равен parent &, но я хочу, чтобы тип c был child.

Могу ли я это сделать?

СПАСИБО ЗА ЧТЕНИЕ.

1 Ответ

0 голосов
/ 06 мая 2018

То, о чем вы, похоже, просите, невозможно. decltype (выражение) будет определять тип значения, для которого выполняется оценка, пока ваша программа все еще компилируется. В вашем примере:

parent * p = new child;

p объявлено как указатель на родителя. Так что если вы разыменуете указатель, тип является родительским. Невозможно узнать динамический тип указателя через decltype. Рассмотрим:

void f(parent * ptr) {
    using type = decltype(*ptr);
    // now what?  type can ONLY be parent
}

class Child1 : public parent { };
class Child2 : public parent { };
void g() {
  Child1 c1;
  Child2 c2;
  f(&c1);
  f(&c2);
}

Что может делать функция f ()? Он вызывается с двумя разными типами, но функция записывается только один раз. Как бы вы хотели, чтобы это обрабатывалось, если бы decltype (* ptr) мог дать наиболее производный тип?

В зависимости от того, что вы хотите сделать с этим типом, вы можете использовать виртуальную функцию. Например, если вы хотите создать другой объект производного типа, вы можете создать фабричную функцию «клон» или getFactory (), которая может создавать новые экземпляры любого типа, предоставленного фабрикой.

Но вам нужно иметь более четкое представление о том, чего вы пытаетесь достичь.

...