You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 17:45:04