我在c ++中有一个关于oop和decltype
的例子:
class parent {
};
class child : public parent {
};
int main()
{
parent * p = new child;
decltype(*p) c = *p;
}
在上面的代码中,c
的类型为parent &
,但我希望c
的类型为child
。
我可以这样做吗?
感谢您的阅读。
答案 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(),它可以创建工厂提供的任何类型的新实例。
但是你必须更清楚地了解你想要实现的目标。