【问题标题】:Function type not a valid type for a template non-type parameter?函数类型不是模板非类型参数的有效类型?
【发布时间】:2014-01-12 12:43:21
【问题描述】:

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

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++树皮:

错误:'RT(unsigned int, DT*)' 不是模板非类型参数结构 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);
    }
};

这次我得到了:

错误:'void(unsigned int, int*)' 不是模板非类型参数结构 GL_resource 的有效类型。

谁能解释一下原因?

【问题讨论】:

    标签: c++ templates opengl raii partial-specialization


    【解决方案1】:

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

    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 将始终是指向函数的类型,而不是函数类型。

    【讨论】:

    • 解决了,谢谢!而且我在模板参数中使用 FT 的想法是错误的,因为它没有在专业化中使用,这个解决方案非常有效,感谢您的指导。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-24
    • 1970-01-01
    • 2018-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多