gpt4 book ai didi

c++ - 如何将指向 GLEW 函数的指针传递给模板?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:18:45 31 4
gpt4 key购买 nike

我正在尝试为保存缓冲区的 OpenGL 编写一个简单的包装器。由于有许多缓冲区,每个缓冲区都有专门的生成和删除功能,我希望使用一个模板,以便我可以轻松地创建这些包装器。最终目标是拥有这样的东西:

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>;

问题是 glGenBuffersglDeleteBuffers 不是编译时常量。在调用 glewInit() 之前它们是不可用的。我希望有一种方法可以延迟查找这些函数,直到生成 VBO。在这种情况下完全有可能无法使用模板,但我希望有一种巧妙的方式来包装我的 OpenGL 资源。


阅读答案后,我了解到:

using TBuilder = decltype(&glGenBuffers);
using TFreer = decltype(&glDeleteBuffers);

template<std::size_t N, TBuilder TCons, TFreer TDes>
struct OGLWrapper{
std::array<GLuint, N> data;
OGLWrapper():data{}{}
void gen(){
(*TCons)(N, &data[0]);
}
~OGLWrapper(){
(*TDes)(N, &data[0]);
}
};

using VBO = OGLWrapper<1, &glGenBuffers, &glDeleteBuffers>;
using VAO = OGLWrapper<1, &glGenVertexArrays, &glDeleteVertexArrays>;

这很好,但我希望删除 TBuilder 和 TFreer typedef。我担心的是泛化,因为我不确定其他函数是否使用这些签名。有没有办法让模板推导出这些类型?

最佳答案

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>;

实例

我们存储指向函数指针的指针。函数指针仅在您调用 glewInit() 时更新。因此,如果您在此之前使用 VBO,它会执行 UB,但您期望什么?

您可能需要注意的一件事是调用约定。但是只要您的 TBuildertypedef 是准确的,您就可以了。

最后一个问题是,即使未调用 gen,您的析构函数也会运行。也许你应该在类的构造函数中运行 gen?或者记录是否使用 bool 调用了 gen

关于c++ - 如何将指向 GLEW 函数的指针传递给模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29658389/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com