2014-10-02 44 views
4

我有以下的功能,可以讓我換OpenGL命令,並在出錯日誌:結束語模板函數調用宏,或避免專業void返回

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

顯然,當我需要指定宏失敗像這樣的返回類型。是否有某種方式要麼:

  • 寫一個更好的宏來處理這種情況,還是......不必通過改變模板函數明確定義的返回類型
  • 避免?

謝謝!

回答

2

關鍵是要認識到,模板參數_GLCheck旨在相同類型由Func返回。因此:

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

首先,我試圖與decltype在前面,但我認爲這是行不通的,所以你得到上面的醜陋。 :)

+0

爲什麼要醜?這就是追溯返回類型的原因。 – Angew 2014-10-02 07:05:28

-1

你不需要一個宏。相反,這樣做:

ObjectThatWillLogInItsDestructor obj(function_name); 
return function_returning_void();