关于c ++中面向对象的decltype的类型

时间:2018-05-06 19:23:51

标签: c++ oop decltype

我在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 :(得分:1)

你似乎要求的是不可能的。当程序仍在编译时,decltype(expression)将确定求值的值的类型。在您的示例中:

parent * p = new child;

p被声明为父对象的指针。因此,如果取消引用指针,则类型为parent。通过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(),它可以创建工厂提供的任何类型的新实例。

但是你必须更清楚地了解你想要实现的目标。