C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 在宏中包装模板函数调用,或者避免专门化void返回大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有以下功能,允许我包装OpenGL命令并在出现问题时记录:

template<typename Res,typename Func,typename... Args>
struct checker {
    static Res run(const std::string& @R_673_1899@,Func&& func,Args&&... args) {
        Res result = func(std::forWARD<Args>(args)...);
        check_and_log_error(@R_673_1899@);
        return result;
    }
};

template<typename Func,typename... Args>
struct checker<void,Func,Args...> {
    static void run(const std::string& @R_673_1899@,Args&&... args) {
        func(std::forWARD<Args>(args)...);
        check_and_log_error(@R_673_1899@);
    }
};

template<typename Func>
struct checker<void,Func> {
    static void run(const std::string& @R_673_1899@,Func&& funC) {
        func();
        check_and_log_error(@R_673_1899@);
    }
};

}

template<typename Res=void,typename... Args>
Res _GLcheck(const std::string& @R_673_1899@,Args&&... args) {
    GLThreadcheck::check();
    return GLchecker::checker<Res,Args...>::run(@R_673_1899@,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& @R_673_1899@,Args&&... args)
    -> decltype(func(args...)) {
// ...

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

本图文内容来源于网友网络收集整理提供,作为学习参使用,版权属于原作者。

大佬总结

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

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

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。