如何在void*指针下检查运行时类型(允许简单类型,没有基类)?

How to check a runtime type under void* pointer (simple types allowed, no base class)?

本文关键字:类型 简单 基类 许简单 指针 检查 运行时 void      更新时间:2023-10-16

如何在 void* 指针下检查什么是运行时类型。比如怎么写这样的函数:

void f(void *p) {
// check if *p is an int or a vector
}

欢迎现代C++版本(14、17(。未来的版本作为未来的信息也很有趣。

没有基类,也没有通用的虚拟方法,也不允许使用简单类型,所以如何在运行时确定实际的对象类型C++; 并不完全相关。

编辑:

好的,在某些情况下,如果调用方知道指针的真实类型,则重载可能是上述简化示例的解决方案。但是稍微复杂一点的东西呢:

using ::std::vector;
void f(vector<void*> v) {
// check if particular *v[i]'s are ints or vectors
}

函数声明中的 void* 也不是我的主意。

目前还不清楚,为什么你首先要有void*。一旦你有了void*关于实际类型的任何信息都会丢失,你想写的函数在C++中是不可能的。如果要使用指向int的指针或指向std::vector的指针调用相同的方法,则宁愿使用重载:

void f(int* p) {
std::cout << "f called with pointer to int";
}
template <typename T>
void f(std::vector<T>* p) {
std::cout << "f called with pointer to vector";
}

这对于基元类型是不可能的,老实说,这是一个糟糕的主意。void*只是任何事物的地址 - 这里没有可用于推断点的实际类型的信息。

实际上,可以对多态类型执行此操作的原因之一是运行时类型信息可以存储在 vtable 中。(请注意,该标准不要求使用 vtable,但它是最常见的实现。

忘掉void*.这是一张单程票;一旦你介入,就没有退路了,所有静态类型信息都永远消失了。 如果使用的类型集未绑定,请选择std::any(c++17 或 boost(。它可能触发动态分配,但也具有小值优化: http://en.cppreference.com/w/cpp/utility/any 但是,如果使用的类型集是可数和绑定的,请考虑std::variant(c++14 或 boost(。您可以调查静态访客模式: http://en.cppreference.com/w/cpp/utility/variant