Я работаю над прототипом игрового движка и у меня следующий вопрос:
Сейчас моя реализация движка связана с 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
Проблема с первым (исходный вариант) виртуальные функции не могут быть шаблонизированы.
Итак, возникает вопрос - как мне это решить?
Какие-нибудь хаки / хитрости / шаблоны для этой ситуации или для шаблонных виртуальных функций эмуляция?