gpt4 book ai didi

c++ - template 遍历整个代码

转载 作者:搜寻专家 更新时间:2023-10-31 00:02:55 24 4
gpt4 key购买 nike

templatized a class earlier作为这种模板化的结果,所有接收这种新模板化类型的对象的类也需要模板化,即使模板化完全不相关。

所以:

  • class Shapeclass SphereCubeModel
  • 的基类
  • 每个Shape 包含一个Mesh
  • Mesh 现在已被模板化,基本上允许 VertexBuffer 具有参数化类型:

所以:

template <typename T> struct Mesh
{
VertexBuffer<T> verts ; // Mesh needs to be templated to allow
// the vertex buffer to be templated as well
} ;

现在包含 Mesh 的类(基类 Shape)也需要模板化:

template <typename T> class Shape
{
Mesh<T>* mesh ;
} ;

现在所有代码中任何位置的方法都需要模板化,即使模板化绝不会影响代码(即该代码与 Mesh 成员的顶点类型无关)

例如,八叉树节点:

// An octree node
template <typename T> struct ONode // but this class doesn't really benefit
// from templatization
{
AABB bounds ;
ONode* parent ; // facilitate movement thru the tree
ONode* children[8]; // cells, octants, cubelets
Shape<T>* objects ; // for the purposes of the Octree,
// But ALL SHAPES BEHAVE THE SAME. <T> serves no purpose

这是一个非常讨厌的工件,我不确定如何在较早的时候停止模板化的渗透,或者模板化是否是一个正确的选择,现在我知道需要多少模板化。

最佳答案

我建议您为 Mesh(或 VertexBuffer,以最有意义的为准)创建一个非模板化基类,以公开不依赖于模板,并在其他地方使用它。例如:

class MeshBase
{
// Functionality that doesn't depend on the template type.
};

template<typename T>
class Mesh : public MeshBase
{
// Functionality that does depend on the template type.
};

这确实意味着您可能需要更频繁地处理这种类型的动态分配值并将它们作为指针传递,但明智地使用智能指针应该可以减轻这种负担。


一般来说,使用面向对象原则和通用编程原则之间存在一定的摩擦,您已经在此处发现了其中的一些原则。每当发生这种情况时,您基本上都需要一个类来保存多个泛型类型的值并对常见行为进行建模,而消费者无需知道模板化类型。有时,即使类型没有公共(public)基础也可以这样做。这种技术称为类型删除和 this article by Thomas Becker对此问题提供了一些见解。

关于c++ - template <typename T> 遍历整个代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7216011/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com