c++ - 函数类型不是模板非类型参数的有效类型?

标签 c++ templates opengl raii partial-specialization

OpenGL定义了C函数来管理资源。我编写了一个简单的包装器来以 RAII 方式处理它们。函数对类似于 unsigned glCreateProgram()void glDeleteProgram(unsigned program)。但是,有一些函数对适用于资源数组,例如 void glGenBuffers(size_t n, unsigned* buffers)void glDeleteBuffers(size_t n, const unsigned* buffers);。对于前者,我编写了一个简单的类来完成这项工作,对于后者,我编写了另一个处理数组的类。但是,我注意到有时我只使用一个缓冲区或纹理,这样我就不必承担 vector 的费用,我想如果释放函数一开始就采用大小参数,我将专门化类析构函数但是...

template <typename T_res,
          typename T_release_func,
          T_release_func func>
struct GL_resource
{
    GL_resource(T_res name_) : name{name_}
    {
    }

    ~GL_resource()
    {
        func(name);
    }

private:
    T_res name;
};

template <typename T_res, typename FT, FT func, typename RT, typename DT>
struct GL_resource<T_res, RT (size_t, DT*), func>
{
    ~GL_resource()
    {
        func(1, name);
    }
};   

对于上述 SSCCE g++ 咆哮:

error: 'RT(unsigned int, DT*)' is not a valid type for a template non-type parameter struct GL_resource

然后我编写了一个虚拟函数 void release(size_t, int*) {} 并将规范重写为

template <typename T_res, typename FT, FT func>
struct GL_resource<T_res, decltype(release), release>
{
    ~GL_resource()
    {
        func(1, name);
    }
};

这次我得到了:

error: 'void(unsigned int, int*)' is not a valid type for a template non-type parameter struct GL_resource.

谁能解释一下为什么吗?

最佳答案

函数不是值,因此它们不能是非类型模板参数;但指向函数的指针可以是:

template <typename T_res, typename RT, typename DT, RT (*func) (size_t, DT*)>
struct GL_resource<T_res, RT (*)(size_t, DT*), func>
{
    ~GL_resource()
    {
        func(1, name);
    }
};   

请注意,即使用作非类型模板参数,函数也会受到指针衰减的影响,因此 FT 将始终是指向函数的指针类型,而不是函数类型。

关于c++ - 函数类型不是模板非类型参数的有效类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20758077/

相关文章:

c++ - boost::program_options 是否支持要求一系列替代方案中的一个?

c++ - 为什么编译器允许字符串文字不是 const?

c++ - 如何解释模板函数调用的 gcov 结果

c++ - 检查一个点是否在 "gluPartialDisk"内(OpenGL 和 C++)

c++ - 在 C++20 中是否不再允许在 std 中为程序定义类型专门化函数模板?

c++ - glLinkProgram() 在程序执行中未定义,即使 glew 报告它存在

c++ - 如何使用 STL 容器来保存基于模板的 shared_ptr?

c++ - "unresolved external symbol"关于 char 数组的模板特化

c++ - OpenGL FrameBuffer 和 glViewport

c++ - OpenGL 旋转问题