Допустим, у нас есть интерфейс window_creator, который отвечает за создание окон. Для простоты это выглядит так:
struct window_creator
{
virtual ~window_creator(){}
handle create_window(size_t width, size_t height, bool fullscreen);
};
Также у нас есть интерфейс для системы рендеринга, который отвечает за рендеринг в окне, созданном window_creator. Для простоты он имеет следующий код:
struct render_system
{
virtual ~render_system(){}
void create(handle window_handle);
};
Также у нас есть 2 реализации интерфейса window_creator:
struct windows7_creator : public window_creator
{
handle create_window(size_t width, size_t height, bool fullscreen) override {
//calls CreateWindow and returns HWND
}
};
struct macos_creator : public window_creator
{
handle create_window(size_t width, size_t height, bool fullscreen) override {
//calls createWindow_ and returns WindowRef
}
};
И 2 реализации для интерфейса render_system:
struct dx_render_system : public render_system
{
void create(handle window_handle) override{
//calls CreateDevice, etc...
}
};
struct opengl_render_system : public render_system
{
void create(handle window_handle) override{
//calls gl... etc...
}
};
Теперь на платформе Windows я могу создавать DX или OpenGL рендерер. И на MacOs я могу создать рендерер OpenGL.
Вопрос в том, какой тип дескриптора мне следует создать для поддержки независимости интерфейсов window_creator и render_system?
В моей текущей реализации я написал typedef для дескриптора:
typedef void* handle;
Есть ли более элегантное решение этой проблемы?