用模板检查函数返回值

调试OpenGL程序时 需要在每个gl api调用后使用glGetError检查状态机错误

GLuint tex;
glGenTextures(1, &tex);
if (glGetError()) {
    LOGE("gl err : file %s line %d errno %d", __FILE__, __LINE__, glGetError());
    abort();
}

编码时每个调用后都加入这样一段代码会让代码变得繁琐
可以封装glGenTextures

void CX_glGenTextures(GLsizei n, GLuint* textures) {
    glGenTextures(n, textures);
    if (glGetError()) {
        LOGE("gl err : file %s line %d errno %d", __FILE__, __LINE__, glGetError());
        abort();
    }
}

}

这么做的缺点在于要把所有的gl api都封装一次 太过繁琐
针对这种情况,可以用模板来实现

template  
void GLExecWithoutRetVal(Fun *fun, Args... args) {
    (*fun)(args...);
    if (glGetError()) {
        LOGE("gl err : file %s line %d errno %d", __FILE__, __LINE__, glGetError());
        abort();
    }
}

template  
void GLExecWithRetVal(Fun *fun, Ret *ret, Args... args) {
    *ret = (*fun)(args...);
    if (glGetError()) {
        LOGE("gl err : file %s line %d errno %d", __FILE__, __LINE__, glGetError());
        abort();
    }
}

调用 : 
GLuint tex;
GLExecWithoutRetVal(&glGenTextures, 1, &tex);//无返回值调用
GLuint program;
GLExecWithRetVal(&glCreateProgram, &program);//带返回值调用

你可能感兴趣的:(用模板检查函数返回值)