Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将指向GLEW函数的指针传递给模板?_C++_Templates_Opengl - Fatal编程技术网

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

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>

我正在尝试为OpenGL编写一个包含缓冲区的简单包装器。因为有很多缓冲区,每个缓冲区都有一个专门的generate和delete函数,所以我希望使用一个模板,以便轻松创建这些包装。最终目标是实现以下目标:

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