шаблонпронизывающий весь код - PullRequest
2 голосов
/ 27 августа 2011

I шаблонизировал класс ранее и в результате этой шаблонизации все классы, которые получили объекты этого нового шаблонного типа, также требуют шаблонизации , даже если шаблонизация полностью не имеет значения .

Итак:

  • class Shape - базовый класс для class Sphere, Cube, Model
  • Каждый 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)

Так, например, узел octree:

// 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

Это действительно неприятный артефакт, и я не уверен, как остановить перкуляцию шаблонизации в более ранней точке , или если шаблонизация была правильным выбором сейчас, когда я вижу, сколько нужно шаблонизировать .

1 Ответ

7 голосов
/ 27 августа 2011

Я бы посоветовал вам создать базовый класс без шаблонов для 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.
};

Это означает, что вам, возможно, чаще придется иметь дело с динамически распределяемыми значениями этого типа и передавать их в виде указателей, но некоторое разумное использование интеллектуальных указателей должно облегчить это бремя.

В общем, существует определенное трение между использованием объектно-ориентированных принципов и общих принципов программирования, некоторые из которых вы обнаружили здесь.Всякий раз, когда это происходит, вам по существу нужен класс, который может содержать значение нескольких универсальных типов и моделировать общее поведение, при этом потребителю не нужно знать шаблонный тип.Иногда это можно сделать, даже если у типов нет общей базы.Эта техника называется стиранием типов, и эта статья Томаса Беккера дает некоторое представление об этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...