【问题标题】:Is there any way to get base type stored in a variable or member pointer?有什么方法可以将基本类型存储在变量或成员指针中?
【发布时间】:2019-08-05 23:00:43
【问题描述】:

考虑下面的代码

#include <type_traits>
#include <iostream>

class A {};

class B : public A {};

class C : public A {};


void parseType(A* base)
{ 
   std::cout << typeid(std::remove_pointer<decltype(base)>::type).name() << "\n";
}


int main(int argc, char** argv)
{
    A* a = new B;

    A* b = new C;

    parseType(a); // outputs A

    parseType(b); // outputs A

    return 0;
}

有什么方法可以从函数parseType() 获取存储在base 参数中的类型?从字面上看,它始终是 base 类型。

【问题讨论】:

  • 逻辑上我希望尽可能避免使用模板...
  • 现在不在电脑前,但是……首先,你的类不是多态的。其次,如果你使它们成为多态并使用 typeid(base) 而没有所有 decltype 的东西应该可以工作
  • @linuxfever 显然,但我试图扣除使用它的类型......如我所见,我想是不可能的......
  • 大多数时候,提出您的问题表明已经做出了糟糕的设计选择,是时候备份并重新评估您之前的选择了。为什么你认为你需要这样做?
  • @JaMiT 用于通过实例覆盖另一个类的现有虚拟方法...我不想用无用的方法填充我的类...

标签: c++ type-deduction


【解决方案1】:

是的。只需取消引用指针并应用typeid

void parseType(A* base)
{ 
    std::cout << typeid(*base).name() << "\n";
}

原因是typeid 将在运行时计算操作数,如果它的操作数是一个多态类型的glvalue 表达式。在您的原始示例中,decltype 是编译时操作并提取 base 的静态类型,因此它始终为 A

请注意,这要求A 至少具有一个虚成员函数,以便它符合多态类型的条件。另外,你忘了#include &lt;typeinfo&gt;

【讨论】:

  • 我将typeid::name() 用于日志,但我说的是自己输入...
  • @nikomaster 当然不能在编译时获取运行时类型...如果那样的话,你必须传递原始类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-21
  • 2018-11-05
  • 2015-02-04
  • 2021-12-18
相关资源
最近更新 更多