C++20下替代宏封装OpenGL/SDL状态函数的现代化实现方案咨询
C++20下替代宏封装OpenGL/SDL状态函数的现代化实现方案咨询
各位C大佬好,我目前正在用C20开发一款基于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 // ... 还有其他类似的宏定义 class window_manager final : public ctx_gl { public: template<typename T, typename... Ts> void set_state(T func, Ts... values); // ... 其他成员方法 };
window_manager.cpp
template<typename T, typename... Ts> void window_manager::set_state(T func, Ts... values) { func(values...); } // 必须手动为每个函数签名写显式实例化 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); // ... 越来越多的显式实例化代码
使用示例
window_mgr.set_state(VIEW, 0, 0, width, height); window_mgr.set_state(GL_RULE, GL_DEPTH_TEST);
遇到的问题
- 用宏来给函数起别名,在现代C++里感觉太老套了,完全不符合现在的风格
- 必须手动维护一堆模板显式实例化的代码,写起来又烦又容易漏,冗余代码太多
我想要实现的目标
希望能找到一个更清爽的替代方案,满足这些要求:
- 保持简单的调用语法(比如
set_state(func, args...)这种形式) - 不用宏,但还要保持这个封装的可扩展性
- 彻底不用手动写模板显式实例化的代码
想请教下各位,有没有更符合C++20 idiom的写法能实现这个需求?
内容来源于stack exchange
相关产品推荐
相关产品推荐

