Contenedor RAII para objetos OpenGL

Quiero escribir un contenedor RAII simple para objetos OpenGL (texturas, buffers de marcos, etc.) Me he dado cuenta de que todosglGen* yglDelete* Las funciones comparten la misma firma, así que mi primer intento fue así:

typedef void (__stdcall *GLGenFunction)(GLsizei, GLuint *);
typedef void (__stdcall *GLDelFunction)(GLsizei, const GLuint *);

template <GLGenFunction glGenFunction, GLDelFunction glDelFunction>
class GLObject
{
    GLuint m_name;
public:
    GLObject() 
    {  
        glGenFunction(1, &m_name);
    }

    ~GLObject()
    {
        glDelFunction(1, &m_name);
    }

    GLuint getName() {return m_name;}
};

typedef GLObject<glGenTextures, glDeleteTextures> GLTexture;

Funciona bien para las texturas, pero falla para los buffers de cuadros:glGenFramebuffers yglDeleteFramebuffers Las direcciones de funciones no se conocen en tiempo de compilación y no se pueden usar como argumentos de plantilla. Así que hice la segunda versión:

class GLObjectBase
{
    GLuint m_name;
    GLDelFunction m_delFunction;

public:
    GLObjectBase(GLGenFunction genFunc, GLDelFunction delFunction)
        : m_delFunction(delFunction)
    {
        genFunc(1, &m_name);
    }

    GLuint getName()
    {
        return m_name;
    }

protected:
    ~GLObjectBase()
    {
        m_delFunction(1, &m_name);
    }
};

class GLFrameBuffer : public GLObjectBase
{
public:
    GLFrameBuffer() : GLObjectBase(glGenFramebuffers, glDeleteFramebuffers) {}
};

Pero no me gusta porque tengo que almacenar el puntero de función en cada instancia que no cambiará en tiempo de ejecución.

¿Cómo puedo crear una clase de contenedor que almacene solo el nombre del objeto en cada instancia sin tener que volver a crear un grupo de clases casi copiadas?

Yo podría hacer algo como esto:

template <int N>
class GLObject2
{
    GLuint m_name;
    static GLDelFunction glDelFunction;
public:
    GLObject2(GLGenFunction genFunction, GLDelFunction delFunc)
    {  
        genFunction(1, &m_name);
        if ( glDelFunction == nullptr )
            glDelFunction = delFunc;
        ASSERT(glDelFunction == delFunc);
    }

    GLuint getName() {return m_name;}

protected:
    ~GLObject2()
    {
        glDelFunction(1, &m_name);
    }
};

template <int N>
GLDelFunction GLObject2<N>::glDelFunction = nullptr;

class GLTexture: public GLObject2<1>
{
public:
    GLTexture(): GLObject2<1>(glGenTextures, glDeleteTextures) {}
};

class GLRenderBuffer: public GLObject2<2>
{
public:
    GLRenderBuffer(): GLObject2<2>(glGenRenderbuffers, glDeleteRenderbuffers) {}
};

¿Alguien puede sugerir una solución más elegante?

Respuestas a la pregunta(2)

Su respuesta a la pregunta