C ++ - вопрос дизайна - PullRequest
       3

C ++ - вопрос дизайна

0 голосов
/ 03 августа 2010

Я работаю над прототипом игрового движка и у меня следующий вопрос:

Сейчас моя реализация движка связана с DirectX, и все работает нормально.

У меня есть core::Rendererкласс, который имеет методы для рендеринга геометрии, установки шейдеров, молний и т. д. ...

Некоторые из них являются шаблонными, некоторые нет.

class Renderer {

   // ...
   template <typename Geometry> RenderGeometry(shared_ptr<Geometry> geometry);
};

Допустим, я хочу расширить гибкость своего движка и не хочу, чтобы он работал с использованием DirectX и OpenGL.Насколько я понимаю, идея состоит в том, чтобы взять все, что связано с интерфейсом, для базового класса core::Renderer, сделать все эти вызовы virtual и затем предоставить их DirectX-специфичные и OpenGL-конкретная реализация.

Если бы мой геометрический объект не был шаблоном, все выглядело бы лучше:

class Renderer {

   virtual void RenderGeometry(shared_ptr<core::Non_template_Geometry> geometry);

};

class DXRenderer {

   // Here goes our custom implementation
   // for DirectX-based geometry rendering
   virtual void RenderGeometry(...)
};

// The same for OpenGL

Проблема с первым (исходный вариант) виртуальные функции не могут быть шаблонизированы.

Итак, возникает вопрос - как мне это решить?

Какие-нибудь хаки / хитрости / шаблоны для этой ситуации или для шаблонных виртуальных функций эмуляция?

Ответы [ 2 ]

2 голосов
/ 03 августа 2010

Использовать базовый Geometry класс:

class Geometry {
public:
    virtual ~Geometry() { }
    virtual void Render() = 0;
};

и каждый из ваших классов типа Geometry наследуется от этого базового класса и реализует свои специфические функции рендеринга, переопределяя Render.

Тогда Renderer::RenderGeometry не обязательно должен быть шаблоном функции; он может просто взять указатель на базовый класс Geometry и вызвать виртуальную функцию Render.

1 голос
/ 03 августа 2010

Шаблон не является необходимостью.Если вы задумаетесь об этом, большинство шаблонов времени выполняют только замену текста и являются более безопасными макросами.

ООП не был предназначен для сильной зависимости от шаблонов, но был составлен и наследован (как то, что предложил Джеймс)

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