如何在运行时检查 typeid 是否为指针?

How to check if a typeid is a pointer at runtime?

在 C++ 中,是否可以在运行时确定一个 type_info 对象是否描述了一个指针?例如,

char a1;
char *a2;

const std::type_info &ti1 = typeid(a1);
const std::type_info &ti2 = typeid(a2);

std::cout << is_pointer(ti1) << std::endl;
std::cout << is_pointer(ti2) << std::endl;

将为 ti1 打印 false,为 ti2 打印 true

显然可以做到 std::is_pointer<decltype(a1)>::value,但这需要我们能够访问变量标识符 a1。如果我们只能访问其 typeid ti1 怎么办?

typeid() 给你一个 std::type_info 对象。就这些了。

正如您在本文档中看到的,type_info 并没有真正告诉您很多。几乎任何有用的东西都有 "implementation defined".

而且,没有任何内容可以权威地告诉您该类型是否是某种指针。

"Implementation defined" 表示您的 C++ 编译器定义了它的含义。如果您要查阅编译器的文档,很有可能会找到一些关于 name() returns 的额外解释,并且很可能可以从 name() 中简单地确定, 类型是否为指针。如何以及以何种方式完全取决于您的编译器,当然,它将是完全不可移植的。