[英]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.