函数类型不是模板非类型参数的有效类型
Function type not a valid type for a template non-type parameter?
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的有效类型。
有人能解释一下原因吗?
函数不是值,因此它们不能是非类型模板参数;但是指向函数的指针可以是:
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++ 中将非指定类型作为参数传递的最佳方法?
- 如何定义采用最通用数量和最类型的参数的函数
- 将类型声明为类型模板参数的模板参数的一部分是否合法?
- 是否可以在C++中有一个"generic"模板参数,该参数可以是非类型模板参数或类型?
- 推断指针非类型模板参数的类型
- 将空*参数转换为各种类型的参数是UB吗?
- 未命名的非类型模板参数有什么意义?
- 标准对此指向成员函数类型模板参数有何说明?是我的代码有误,还是 MSVS 16.6 有问题?
- Lambda可以用作非类型模板参数吗
- 类型为 "int*" 的参数与 C++ 中错误类型"int**"参数不兼容
- 基于类型作为参数的字符串表示形式具有不同返回类型的函数
- 具有"templated"返回类型和参数的函数指针
- 如何制作可以接受任何类型的参数的 std::函数和 lambda
- 指向(数据)成员的指针作为非类型模板参数,例如具有自动存储持续时间/无链接
- 为什么在传递长整型时调用具有两个双精度类型的参数的重载函数?
- C++ 类型的参数与 void (__cdecl*)(void) 类型的参数不兼容,当调用 std::atexit()
- 以特征类型作为参数的泛型函数回调
- 非类型模板参数