gpt4 book ai didi

c++ - 在宏中包装模板函数调用,或避免特化 void 返回

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:17:16 24 4
gpt4 key购买 nike

我有以下功能,允许我包装 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,但我认为那是行不通的,所以你得到了上面的丑陋之处。 :)

关于c++ - 在宏中包装模板函数调用,或避免特化 void 返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26155495/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com