加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 07:09:54 所属栏目:百科 来源:网络整理
导读:我有以下功能,允许我包装OpenGL命令并在出现问题时记录: templatetypename Res,typename Func,typename... Argsstruct Checker { static Res run(const std::string function_name,Func func,Args... args) { Res result = func(std::forwardArgs(args)...)
我有以下功能,允许我包装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,但我认为这不可行,所以你得到了上面的丑陋.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读