c++ - template <typename T> 遍历整个代码

标签 c++ templates

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/

相关文章:

c++ - 使用 `reinterpret_cast` 调用非静态成员函数而不实例化

c++ - 初始化输出后获取控制台大小

c++ - 为将尝试使用的对象返回 NULL? (获取核心转储——C++ 新手)

c++ - ifft 结果与原始信号不同

c++ - 在 LLVM 下的 Makefile 中通过 LDFLAGS 加载 zlib 的正确方法是什么?

c++ - 编译器提示模板参数的数量错误,即使它在 boost 库文件中是正确的

c++ - 基于继承类的模板特化

C++ - 通过单个指针访问多个对象的接口(interface)

c++ - 在没有参数列表的情况下无效使用模板名称 'SmartArray'

c++ - 函数的可选模板化参数