簡體   English   中英

在宏中包裝模板函數調用,或者避免專門化void返回

[英]Wrapping a template function call in a macro, or avoid specializing a void return

我有以下功能,允許我包裝OpenGL命令並在出現問題時記錄:

template<typename Res, typename Func, typename... Args>
struct Checker {
    static Res run(const std::string& function_name, Func&& func, Args&&... args) {
        Res result = func(std::forward<Args>(args)...);
        check_and_log_error(function_name);
        return result;
    }
};

template<typename Func, typename... Args>
struct Checker<void, Func, Args...> {
    static void run(const std::string& function_name, Func&& func, Args&&... args) {
        func(std::forward<Args>(args)...);
        check_and_log_error(function_name);
    }
};

template<typename Func>
struct Checker<void, Func> {
    static void run(const std::string& function_name, Func&& func) {
        func();
        check_and_log_error(function_name);
    }
};

}

template<typename Res=void, typename Func, typename... Args>
Res _GLCheck(const std::string& function_name, Func&& func, Args&&... args) {
    GLThreadCheck::check();
    return GLChecker::Checker<Res, Func, Args...>::run(function_name, std::forward<Func>(func), std::forward<Args>(args)...);
}

我想將_GLCheck包裝在一個宏中,以便自動提供函數名參數,例如

#define GLCheck(...) _GLCheck(__func__, __VA_ARGS__)

如果GL調用沒有返回值,這可以正常工作,但如果確實如此,那么_GLCheck必須像這樣實例化:

program_object_ = _GLCheck<GLuint>(__func__, glCreateProgram);

當我需要像這樣指定返回類型時,我的宏顯然失敗了。 有沒有辦法:

  • 寫一個更好的宏來處理這種情況,或者......
  • 避免通過更改模板函數顯式定義返回類型?

謝謝!

關鍵是要認識到_GLCheck的模板參數與Func返回的類型相同。 因此:

template<typename Func, typename... Args>
auto _GLCheck(const std::string& function_name, Func&& func, Args&&... args)
    -> decltype(func(args...)) {
// ...

首先我嘗試使用前面的decltype ,但我認為這不可行,所以你得到了上面的丑陋。 :)

你不需要宏。 而是做類似的事情:

ObjectThatWillLogInItsDestructor obj(function_name);
return function_returning_void();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM