C++如何获取不完整类型的typeid 实现存储指针的原类型识别
解决方案
核心思路是用模板静态变量地址作为类型唯一标识,该特性不依赖类型完整性,完美适配SDL_Texture这类前置声明的不透明类型。
实现步骤
1. 定义类型标识生成工具
利用C++模板特性:每个不同类型对应的模板实例会持有独立的静态变量,其地址全局唯一,无需类型完整即可生成。
// 为每个类型T生成唯一的标识地址 template<typename T> void* GetTypeTag() { static char unique_tag; return &unique_tag; }
2. 调整存储结构
将原方案中的type_info替换为类型标识地址:
#include <vector> #include <utility> // 存储结构:<指针地址, 类型标识> std::vector<std::pair<void*, void*>> pointers;
3. 修改指针添加逻辑
仅需传入类型的前置声明即可正常添加:
// 即使SDL_Texture是仅前置声明的不完整类型也可正常使用 SDL_Texture* tex_ptr = /* 你的SDL纹理指针 */; pointers.emplace_back(tex_ptr, GetTypeTag<SDL_Texture>()); // 其他类型同理 int* int_ptr = new int(42); pointers.emplace_back(int_ptr, GetTypeTag<int>());
4. 修改取用执行逻辑
通过对比类型标识地址匹配类型,逻辑和原方案一致:
for (auto& item : pointers) { if (item.second == GetTypeTag<SDL_Texture>()) { auto tex = static_cast<SDL_Texture*>(item.first); DoStuff(tex); } else if (item.second == GetTypeTag<int>()) { auto num = static_cast<int*>(item.first); DoStuff(num); } // 其余类型分支按需扩展即可 }
方案优势
- 无类型完整性要求,只要有前置声明即可使用,完美兼容所有第三方库的不透明类型
- 运行时开销极低,仅为普通指针地址对比,性能优于
type_info相等性判断 - 纯标准C++实现,无外部依赖,兼容所有合规编译器
内容的提问来源于stack exchange,提问作者Kemsikov
相关产品推荐
相关产品推荐

