C++如何通过枚举变量访问对应特化Map模板对象,替代switch分支
问题核心原因
模板参数要求必须是编译期常量,你遍历std::vector拿到的枚举值是运行时才能确定的变量,自然无法直接作为模板参数传入,这是你之前编译失败的根本原因。
最优解决方案(新手友好、无冗余)
你可以提前把所有枚举值对应模板特化的静态成员,汇总为一个运行时查找表,后续遍历直接查表即可,完全不需要写switch分支:
- 先定义统一存储顶点属性的结构体
struct VertexAttrib { DXGI_FORMAT dxgiFormat; const char* semantic; UINT offset; };
- 构建全局常量查找表(如果枚举值连续用数组即可,不连续可以换成
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特化,只需要在这里加一行对应条目即可 };
- 简化后的遍历逻辑
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
相关产品推荐
相关产品推荐

