考虑以下代码
#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
类型。
答案 0 :(得分:5)
是的。只需取消引用指针并应用typeid
:
void parseType(A* base)
{
std::cout << typeid(*base).name() << "\n";
}
原因是typeid
将在运行时评估操作数,如果其操作数是多态类型的 glvalue表达式。在您的原始示例中,decltype
是编译时操作,并且提取了base
的静态类型,因此它始终为A
。
请注意,这要求A
至少具有一个虚拟成员函数,才能将其视为多态类型。另外,您忘记了#include <typeinfo>
。