Современная альтернатива C ++ макросам для обертывания функций состояния OpenGL/SDLC++

Программы на C++. Форум разработчиков
Anonymous
Современная альтернатива C ++ макросам для обертывания функций состояния OpenGL/SDL

Сообщение Anonymous »

Я разрабатываю приложение C ++ 20 с использованием OpenGL и SDL3 с классом window_manager , который завершает окно и управление государством OpenGL. Вместо записи отдельных функций членов для каждого вызова OpenGL/SDL (например, Glenable , Glviewport , SDL_GL_Setattribute ), я использую универсальный подход SET_STATE .

Код: Выделить всё

window_manager.h

Код: Выделить всё

#define GL_ATTR SDL_GL_SetAttribute
#define GL_RULE glEnable
#define VIEW glViewport
// ... others

class window_manager final : public ctx_gl {
public:
template
void set_state(T func, Ts... values);
// ... other methods
};
< /code>
window_manager.cpp

Код: Выделить всё

template
void window_manager::set_state(T func, Ts... values) {
func(values...);
}

// Explicit instantiations required for each function signature
template void window_manager::set_state(void (*)(unsigned int), int);
template void window_manager::set_state(void (*)(int, int, int, int), int, int, int, int);
// ... more instantiations
< /code>
[b]Usage Example[/b]
window_mgr.set_state(VIEW, 0, 0, width, height);
window_mgr.set_state(GL_RULE, GL_DEPTH_TEST);
Проблемы

[*] макросы используются для функций псевдонима, которые чувствуют себя устаревшими в современном C ++.
explicit watplate . /> Что я бы хотел, чтобы достичь < /h3>
Альтернатива чище, что: < /p>

Содержит простой синтаксис вызовов (например, set_state (func, args ...) < /code>). < /li>
избегает макроса, в то время как сохраняет upprer extensible. /> Устраняет необходимость в экземпляре ручного шаблона.>

Подробнее здесь: https://stackoverflow.com/questions/796 ... -functions

Вернуться в «C++»