如何将模板类作为模板参数实现Mesh实体抽象设计
解决方案
问题的核心是需要使用模板模板参数(template template parameter)来定义entity类的模板参数,因为simplex和quadrangle本身都是带模板参数的类,而非普通类型。
1. 修正entity类的模板参数定义
将entity的第一个模板参数改为模板模板参数,让它能接受simplex或quadrangle这类模板:
// T是接受单个int参数的模板类(匹配simplex/quadrangle的定义) template<template<int> typename T, int D> class entity { public: // 现在可以正确用T<0>、T<1>等实例化关联实体类型 std::vector<T<0>> incident0; // 关联的0维实体(点) std::vector<T<1>> incident1; // 关联的1维实体(边) std::vector<T<2>> incident2; // 关联的2维实体(三角形/四边形) std::vector<T<3>> incident3; // 关联的3维实体(四面体/六面体) };
2. 验证预期的声明方式
现在你可以按照需求声明实体:
entity<simplex, 2>:表示三角形实体(2维单纯形)entity<quadrangle, 2>:表示四边形实体(2维四边形)
3. 扩展到mesh类
同理,mesh类也可以用模板模板参数实现你想要的类型区分:
template<template<int> typename T, int D> class mesh { public: std::vector<entity<T, D>> main_entities; // 存储D维主实体(如四面体) std::vector<T<0>> points; // 存储所有0维点实体 std::vector<T<1>> edges; // 存储所有1维边实体 // 按需添加其他维度实体的存储 };
使用示例:mesh<simplex,3>表示由四面体构成的3D网格,mesh<quadrangle,2>表示由四边形构成的2D网格。
补充说明
- 模板模板参数
template<int> typename T明确限定了T是接受单个int参数的模板类,完美适配你已定义的simplex和quadrangle。 - 后续若新增拓扑类型(如六面体
hexahedron),只要它遵循template<int> class的定义形式,就能直接复用entity和mesh类,完全符合你提升代码抽象度的需求。 - 可以给
entity添加编译期判断逻辑,比如根据当前维度D自动屏蔽无效的入射实体(比如2维实体不需要incident3),减少冗余。
内容的提问来源于stack exchange,提问作者Taendyr
相关产品推荐
相关产品推荐

