有什么方法可以将基本类型存储在变量或成员指针中?

时间:2019-08-05 23:00:43

标签: c++ type-deduction

考虑以下代码

#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;
}

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

1 个答案:

答案 0 :(得分:5)

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

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

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

请注意,这要求A至少具有一个虚拟成员函数,才能将其视为多态类型。另外,您忘记了#include <typeinfo>