我想爲保存緩衝區的OpenGL寫一個簡單的包裝。由於有很多緩衝區,每個緩衝區都有專門的生成和刪除功能,所以我希望能夠使用模板,以便我可以輕鬆創建這些包裝。最終的目標是有這樣的事情:如何將指向GLEW函數的指針傳遞給模板?
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>;
的問題是,glGenBuffers
和glDeleteBuffers
沒有編譯時間常數。它們不可用,直到調用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類型定義。我擔心的是泛化,因爲我不確定其他函數是否使用這些簽名。有沒有辦法讓模板推斷出這些類型?
如果沒有編譯時,它不會作爲模板參數工作 - 使用正常(運行時間)參數。 –
有沒有什麼辦法可以使''使用'類似,這樣我就不必每次都寫函數參數了? – user975989