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

如何将模板类作为模板参数实现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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 21:34:54