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

C++如何通过枚举变量访问对应特化Map模板对象,替代switch分支

问题核心原因

模板参数要求必须是编译期常量,你遍历std::vector拿到的枚举值是运行时才能确定的变量,自然无法直接作为模板参数传入,这是你之前编译失败的根本原因。

最优解决方案(新手友好、无冗余)

你可以提前把所有枚举值对应模板特化的静态成员,汇总为一个运行时查找表,后续遍历直接查表即可,完全不需要写switch分支:

  1. 先定义统一存储顶点属性的结构体
struct VertexAttrib {
    DXGI_FORMAT dxgiFormat;
    const char* semantic;
    UINT offset;
};
  1. 构建全局常量查找表(如果枚举值连续用数组即可,不连续可以换成std::unordered_map<VertexType, VertexAttrib>)
constexpr VertexAttrib g_vertexAttribMap[] = {
    [static_cast<size_t>(VertexType::Position2D)] = {
        Map<VertexType::Position2D>::dxgiFormat,
        Map<VertexType::Position2D>::semantic,
        Map<VertexType::Position2D>::offset
    },
    // 后续新增其他VertexType特化,只需要在这里加一行对应条目即可
};
  1. 简化后的遍历逻辑
UINT offset = 0;
for (const auto& type : v) {
    const auto& attrib = g_vertexAttribMap[static_cast<size_t>(type)];
    des.push_back(D3D11_INPUT_ELEMENT_DESC{
        attrib.semantic, 0, attrib.dxgiFormat, 0, offset,
        D3D11_INPUT_PER_VERTEX_DATA, 0
    });
    offset += attrib.offset;
}

这种方案后续维护成本极低,新增枚举特化时不需要修改核心处理逻辑,仅需要更新查找表即可。

内容的提问来源于stack exchange,提问作者BoomBac

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 05:54:03