You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);

遇到的问题

  1. 用宏来给函数起别名,在现代C++里感觉太老套了,完全不符合现在的风格
  2. 必须手动维护一堆模板显式实例化的代码,写起来又烦又容易漏,冗余代码太多

我想要实现的目标

希望能找到一个更清爽的替代方案,满足这些要求:

  • 保持简单的调用语法(比如set_state(func, args...)这种形式)
  • 不用宏,但还要保持这个封装的可扩展性
  • 彻底不用手动写模板显式实例化的代码

想请教下各位,有没有更符合C++20 idiom的写法能实现这个需求?


内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 10:23:01