OpenGL定义了C函数来管理资源。我编写了一个简单的包装器来以RAII的方式处理它们。函数对类似于无符号glCreateProgram()
和uluglDeleteProgram(无符号程序)
。但是,也有一些函数对适用于资源数组,例如uluglGenBuffers(size_tn,无符号*缓冲区)
和uluglDeleteBuffers(size_tn,const无符号*缓冲区);
。对于前者,我编写了一个简单的类来完成这项工作,对于后者,我编写了另一个处理数组的类。然而,我注意到有时我只使用一个缓冲区或纹理,在那里我不必承担向量的费用,我想如果发布函数在开始时采用大小参数,我会专门化类析构函数,但是...
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(无符号 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);
}
};
这次我得到了:
错误:“ulu(无符号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
将始终是指向函数的指针类型,而不是函数类型。
我在一个项目中,必须使用一个常量模板对象的引用作为另一个对象模板的参数。 简单地说,我想这样做: 问题是我不知道如何让它发生,我需要你的帮助。 在visual studio上,上述代码将产生以下错误:“C2971:具有非静态存储持续时间的变量不能用作非类型参数” 如果我尝试使用 ,则进行以下更改: 我得到以下错误“C2131:表达式未计算为常数” 好吧,我确实尝试了一些我在其他帖子上看到的关于类似
也许我累了,但是我被这个简单的局部特化卡住了,它不起作用,因为指定模板参数: 将替换为,或没有帮助。那么这种专门化是否可能呢?
考虑以下示例: 而且,如果我们将非类型模板参数的类型改为占位符类型,如下所示: 然后,GCC接受,而Clang拒绝它(两者都拒绝,如上)。 海合会演示,铿锵演示。 (1)GCC HEAD 11.0.0 202 10117和Clang HEAD 12.0.0(20210118),。
上节的 Sstack 类模扳只用模板首部的类型参数,也可以使用无类型参数(non-type parameter),无类型参数可以有默认参数,一般将无类型参数当作Const处理。例如,模板首都可以取 int elements 参数,如下所示: template<class T,int elements> // note non-type parameter 然后下列声明: Stack<double,
我对编程和C++相当陌生。我有一个函数,我想接受以模板化值作为参数的函数指针。我的意思是... 我有这个功能: 我试过的: 结果: .h:165:22:注意:已忽略候选模板:无法将“function ,allocator >&)”与“void(*)(bool,std::vectorstd::vectorstd::allocatorstd::tuple &)”void postgrescaller:
使用以下代码生成时 生成以下诊断(代码后): 诊断: 有趣的部分不是关于歧义错误本身(这不是这里主要关注的问题)。有趣的是,当仅使用函数名调用fun时,第一个fun的模板参数F被解析为纯函数类型double(double),而第二个fun的模板参数F被解析为更期望的函数指针类型。 然而,当我们将调用<代码>乐趣(测试) 更改为<代码>乐趣( 这种行为似乎是所有Clang和GCC(以及Visual