C++ 如何将指向GLEW函数的指针传递给模板?
我正在尝试为OpenGL编写一个包含缓冲区的简单包装器。因为有很多缓冲区,每个缓冲区都有一个专门的generate和delete函数,所以我希望使用一个模板,以便轻松创建这些包装。最终目标是实现以下目标:C++ 如何将指向GLEW函数的指针传递给模板?,c++,templates,opengl,C++,Templates,Opengl,我正在尝试为OpenGL编写一个包含缓冲区的简单包装器。因为有很多缓冲区,每个缓冲区都有一个专门的generate和delete函数,所以我希望使用一个模板,以便轻松创建这些包装。最终目标是实现以下目标: gl::VBO v; v.gen(); 我已尝试做以下工作: using TBuilder = void(*)(GLsizei, GLuint *); template<std::size_t N, TBuilder TConstructor, TBuilder TFreer>
gl::VBO v;
v.gen();
我已尝试做以下工作:
using TBuilder = void(*)(GLsizei, GLuint *);
template<std::size_t N, TBuilder TConstructor, TBuilder TFreer>
struct OGLWrapper{
std::array<GLuint, N> data;
void gen(){
TConstructor(N, &data[0]);
}
~OGLWrapper(){
TFreer(N, &data[0]);
}
};
using VBO = OGLWrapper<1, glGenBuffers, glDeleteBuffers>;
这很好,但我希望删除TBuilder和TFreer typedef。我关心的是泛化,因为我不确定其他函数是否使用这些签名。有没有办法让模板推断出这些类型?使用TBuilder=void(*)(GLsizei,GLuint*);
using TBuilder = void(*)(GLsizei, GLuint *);
template<std::size_t N, TBuilder* TConstructor, TBuilder* TFreer>
struct OGLWrapper{
std::array<GLuint, N> data;
void gen(){
(*TConstructor)(N, &data[0]);
}
~OGLWrapper(){
(*TFreer)(N, &data[0]);
}
};
using VBO = OGLWrapper<1, &glGenBuffers, &glDeleteBuffers>;
模板
结构OGLWrapper{
std::数组数据;
void gen(){
(*t构造函数)(N,&data[0]);
}
~OGLWrapper(){
(*TFreer)(N和数据[0]);
}
};
使用VBO=OGLWrapper;
实例
我们存储指向函数指针的指针。函数指针仅在调用glewInit()
时更新。因此,如果您在此之前使用VBO,它将执行UB,但您期望得到什么
有一件事你可能必须小心,那就是打电话给大会。但是只要你的TBuilder
的typedef
是准确的,你就会很好
最后一个问题是,即使未调用
gen
,析构函数也会运行。您可能应该在类的构造函数中运行gen
?或者,如果使用bool
调用了gen
,请记录以下解决方案,该解决方案使用宏来构造包装器,但不使用宏:
#define CREATE_GLEW_WRAPPER(name, N, construct, freer) \
struct name { \
std::array<GLuint, N> data; \
void gen() { \
construct(N, &data[0]); \
} \
\
~name() { \
freer(N, &data[0]); \
} \
};
namespace gl {
CREATE_GLEW_WRAPPER(VBO, 1, glGenBuffers, glDeleteBuffers)
}
#undef CREATE_GLEW_WRAPPER
\define CREATE\u GLEW\u包装器(名称,N,构造,更自由)\
结构名称{\
std::数组数据\
void gen(){\
构造(N,&数据[0])\
} \
\
~name(){\
freer(N,&数据[0])\
} \
};
名称空间gl{
创建_GLEW_包装(VBO,1,glGenBuffers,glDeleteBuffers)
}
#未定义创建\u GLEW\u包装器
如果不是编译时,它将永远不会作为模板参数工作-为函数使用普通(运行时)参数。是否有任何方法可以使用类似于的,这样我就不必每次都编写函数参数?抱歉,我对函数指针的理解是错误的-我正要撤消编辑。问题是glGenBuffers
不一定是TBuilder的一种类型。它们被定义为#define glGenBuffers GLEW_GET_FUN(uu glewGenBuffers)
,它们的内部类型都不同。例如,glGenBuffers
是PFNGLGENBUFFERSPROC
和gldeletebuffersproc
是PFNGLDELETEBUFFERSPROC
,我无法在指向这些类型的指针和TBuilder之间进行转换。@user975989这听起来像是一个与您在OP中描述的完全不同的问题?从我对源代码的阅读来看,类型是固定的,但这两种情况不同。那么,对这两种情况使用不同的类型?问题是它们有时是指针,有时不是?对不起,这是我沟通失误的原因。有没有一种方法可以不用为每种类型键入typedef就可以推断出类型?
#define CREATE_GLEW_WRAPPER(name, N, construct, freer) \
struct name { \
std::array<GLuint, N> data; \
void gen() { \
construct(N, &data[0]); \
} \
\
~name() { \
freer(N, &data[0]); \
} \
};
namespace gl {
CREATE_GLEW_WRAPPER(VBO, 1, glGenBuffers, glDeleteBuffers)
}
#undef CREATE_GLEW_WRAPPER