【问题标题】:Debug function wrapper调试函数包装
【发布时间】:2016-09-02 13:04:50
【问题描述】:

我使用模板函数来包装 OpenGL API 调用(用于捕获错误代码):

template<typename Function, typename ... Args>
auto __glFunction(const char *file, int line, Function f, Args ...args) -> decltype(f(args...)) {
    auto result = f(args...);
    auto error = glGetError();
    if (error != GL_NO_ERROR) {
        switch(error) {
            case GL_INVALID_ENUM:
                std::cout << "GL_INVALID_ENUM";
                break;
            case GL_INVALID_VALUE:
                std::cout << "GL_INVALID_VALUE";
                break;
            case GL_INVALID_OPERATION:
                std::cout << "GL_INVALID_OPERATION";
                break;
            case GL_INVALID_FRAMEBUFFER_OPERATION:
                std::cout << "GL_INVALID_FRAMEBUFFER_OPERATION";
                break;
            case GL_OUT_OF_MEMORY:
                std::cout << "GL_OUT_OF_MEMORY";
                break;
            case GL_STACK_UNDERFLOW:
                std::cout << "GL_STACK_UNDERFLOW";
                break;
            case GL_STACK_OVERFLOW:
                std::cout << "GL_STACK_OVERFLOW";
                break;
            default:
                std::cout << "GL_ERROR #" << error;
                break;
        }
        std::cout << " at " << file << ":" << line << std::endl;
    }

    return result;
};

#define glFunction(function, ...) __glFunction(__FILE__, __LINE__, function, ##__VA_ARGS__)

它适用于具有非 void 返回类型的函数。我应该如何指定模板以使用返回 void 的函数以及非 void。

【问题讨论】:

  • 你可以使用类似于this的东西。
  • 谢谢!这就是我想要的。
  • 不客气。但是,您应该将该答案发布为答案,而不是编辑。鼓励自己回答。

标签: c++ templates c++11 variadic


【解决方案1】:

解决方案

可能对某人有帮助。 下一个代码适用于(void / non-void)返回函数:

void __glPrintError(const char *file, const int line) {
    auto error = glGetError();
    if (error != GL_NO_ERROR) {
        switch(error) {
            case GL_INVALID_ENUM:
                std::cout << "GL_INVALID_ENUM";
                break;
            case GL_INVALID_VALUE:
                std::cout << "GL_INVALID_VALUE";
                break;
            case GL_INVALID_OPERATION:
                std::cout << "GL_INVALID_OPERATION";
                break;
            case GL_INVALID_FRAMEBUFFER_OPERATION:
                std::cout << "GL_INVALID_FRAMEBUFFER_OPERATION";
                break;
            case GL_OUT_OF_MEMORY:
                std::cout << "GL_OUT_OF_MEMORY";
                break;
            case GL_STACK_UNDERFLOW:
                std::cout << "GL_STACK_UNDERFLOW";
                break;
            case GL_STACK_OVERFLOW:
                std::cout << "GL_STACK_OVERFLOW";
                break;
            default:
                std::cout << "GL_ERROR #" << error;
                break;
        }
        std::cout << " at " << file << ":" << line << std::endl;
    }
}

template<typename Function, typename ... Args>
auto __glFunction(const char *file, const int line, Function f, Args ...args) ->
    typename std::enable_if<!std::is_same<decltype(f(args...)), void>::value, decltype(f(args...))>::type {

    auto result = f(args...);
    __glPrintError(file, line);
    return result;
};

template<typename Function, typename ... Args>
auto __glFunction(const char *file, const int line, Function f, Args ...args) ->
    typename std::enable_if<std::is_same<decltype(f(args...)), void>::value, decltype(f(args...))>::type {

    f(args...);
    __glPrintError(file, line);
};

#define glFunction(function, ...) __glFunction(__FILE__, __LINE__, function, ##__VA_ARGS__)

【讨论】:

  • is_void 中还有&lt;type_traits&gt;
  • 根据Args 是什么,您可能还想使用我链接的答案中的完美转发内容。
  • Args 总是微不足道的或通过指针传递,所以我认为 r-value 规范在这里无济于事。
猜你喜欢
  • 2012-09-03
  • 2018-03-07
  • 1970-01-01
  • 2017-09-13
  • 1970-01-01
  • 2016-07-04
  • 2021-06-26
  • 2015-06-10
  • 2013-06-22
相关资源
最近更新 更多