如何在void*指针下检查运行时类型(允许简单类型,没有基类)?
How to check a runtime type under void* pointer (simple types allowed, no base class)?
如何在 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
- 使用简单类型列表实现的指数编译时间.为什么
- 当无法使用模板和宏时,生成类型变体C++代码的最简单方法是什么?
- 从函数返回任意简单类型的数据
- reinterpret_cast,只读访问,简单的可复制类型,会出什么问题?
- 在C++中将算术类型转换为 std::array 的最简单方法<uint8_t>
- OpenSSL模块化最大数据类型大小的简单方法
- 为具有多个参数的函数创建 SWIG 类型图的更简单方法?
- 如何在void*指针下检查运行时类型(允许简单类型,没有基类)?
- 是无符号的int"简单类型说明符"
- 查找树(不属于任何特定类型的简单连接树)中两个节点之间的路径
- 为什么 std::atomic 在视觉C++中不是简单的类型?
- 模板类型在简单的数据类型中扣除
- 简单的方法将隐式类型促销添加到std ::复杂类操作员
- Swig 简单类型 typedef 参数
- 专门针对大型类型的常量T&和用于简单类型的T的模板
- 简单,但找不到:使用类型类的 STL 队列的成员变量的语法
- 在C 中创建简单类型
- 在Visual C++6.0 MFC中,CString是否可以像简单类型而不是类一样安全地处理
- 运算符重载:简单添加...错误 C2677:二进制"+":未找到采用类型 ___ 的全局运算符(或者不存在可接受的转换)
- 如果包含的类型是可简单复制的类型,则 std::Optional 是否为可平凡复制的类型