我可以使用 decltype() 或其他东西通过指针获取真实类型吗?



例如:

class Foo {
};
class Bar : public Foo {
};
int main() {
Foo* foo = new Bar;
std::cout << typeid(decltype(*foo)).name() << std::endl;
}

我尝试了一些语法,有或没有decltype,但结果都是关于类型Foo的。有什么方法可以通过Foo类型的指针获取类型Bar

附言我只想在运行时获取类型信息,欢迎任何黑客攻击。

编辑:如果我有很多类型,if/else 和dynamic_cast技巧不是很可以接受。

首先,对象的动态类型只能为多态类类型获取,这意味着基类必须至少有一个虚函数。

class Foo {
public:
virtual ~Foo() = default;
};
class Bar : public Foo {
};

其次,通过将运算符直接应用于引用对象的表达式来获取动态类型typeid

int main() {
Foo* foo = new Bar;
std::cout << typeid(*foo).name() << std::endl;
}

decltype是仅编译时运算符。

你可以用dynamic_cast来做到这一点。

从参考:如果指向的对象不是该类型的对象,dynamic_cast将返回nullptr

例如。

class Foo {
public:
virtual ~Foo() = default; // To make foo polymorphic
};
class Bar : public Foo {};
//....
Foo *foo = new Bar;
if (dynamic_cast<Foo *>(foo) == nullptr) {
std::cout << "Not a bar!" << std::endl;
} else {
std::cout << "Bar" << std::endl;
}
//....

注意:此方法仅在运行时有效。

它不起作用,因为 Foo 不是多态类型。
此示例适用于:

#include <iostream>
#include <typeinfo>
class Foo {
public:
virtual void foo() {} // This makes Foo a polymorphic type
};
class Bar : public Foo {
};
int main() {
Foo* foo = new Bar;
std::cout << typeid(*foo).name() << std::endl;
}

最新更新