【问题标题】:About type of decltype in object-orient in c++关于 c++ 中面向对象的 decltype 类型
【发布时间】:2018-05-06 19:23:50
【问题描述】:

我有一个关于 oop 和 decltype 的 c++ 示例:

class parent {

};

class child : public parent {

};

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

在上面的代码中,c 的类型是 parent &,但我希望 c 的类型是 child

我可以吗?

感谢您的阅读。

【问题讨论】:

  • 您可以直接将c声明为child,也可以将p声明为child *...
  • 您不能让p 的编译时类型依赖于运行时属性。根据您尝试以这种方式解决的问题,可能有也可能没有适合您的解决方法。如果您有兴趣获得有关其他方法的帮助,请提供有关此原因的更多详细信息。
  • 您正在寻找typeid
  • 我明白了。可能是不可能的。非常感谢!
  • 查询对象的动态类型到例如调用不属于静态类型接口的方法通常是设计问题的标志。也许如果您打开另一个问题并描述为什么要这样做,有人可以提出更好的替代设计?

标签: c++ oop decltype


【解决方案1】:

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

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(),它可以创建提供工厂的任何类型的新实例。

但是你必须更清楚地知道你想要完成什么。

【讨论】:

  • 我明白了。谢谢你的解释!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-22
  • 1970-01-01
  • 1970-01-01
  • 2015-06-02
  • 1970-01-01
  • 2013-11-30
  • 1970-01-01
相关资源
最近更新 更多