c – 在宏中包装模板函数调用,或者避免专门化void返回

c – 在宏中包装模板函数调用,或者避免专门化void返回,第1张

概述我有以下功能,允许我包装OpenGL命令并在出现问题时记录: template<typename Res, typename Func, typename... Args>struct Checker { static Res run(const std::string& function_name, Func&& func, Args&&... args) { Res 我有以下功能,允许我包装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,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... Args>Res _GLCheck(const std::string& function_name,Args&&... args) {    GLThreadCheck::check();    return GLChecker::Checker<Res,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,Args&&... args)    -> decltype(func(args...)) {// ...

首先我尝试使用前面的decltype,但我认为这不可行,所以你得到了上面的丑陋. 总结

以上是内存溢出为你收集整理的c – 在宏中包装模板函数调用,或者避免专门化void返回全部内容,希望文章能够帮你解决c – 在宏中包装模板函数调用,或者避免专门化void返回所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/langs/1227410.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存