变分模板和宏

Variadic Templates and Macros

本文关键字:      更新时间:2023-10-16

我目前正在开发一个opengl包装器,但visual-c++似乎不接受此代码:

#pragma once
#include <cassert>
#include <GL/glew.h>
namespace Spiky {
namespace GLLayer {
template <typename RV, typename ... Params>
inline auto _checked_glFunc(
 RV (GLAPIENTRY *pfn)(Params...),
 const char*) -> decltype(pfn)
{
  return pfn;
}
template <typename RV, typename ...ARGS>
inline auto _checked_glFunc(RV (* GLAPIENTRY *ppfn)(ARGS...),
                            const char* func_name)
                          -> decltype(*ppfn)
{
  assert(!ppfn || !*ppfn, "Invalid GLFunction !");
  return *ppfn;
}
#define SPIKY_GLFUNC(FUNCNAME) 
::Spiky::GLLayer::_checked_glFunc(&::gl##FUNCNAME, ##FUNCNAME)
} //namespace GLLayer
} //namespace Spiky

main.cpp:

//includes..
int main(int argc, char** args)
{
  GLuint* names;
  SPIKY_GLFUNC(GenBuffers)(1, names); //gl call test
  return EXIT_SUCCESS;
}

Visualc++实际上给我的错误GenBuffers是未定义的!

有什么建议吗?

编辑

如前所述,宏中存在错误(见答案);但现在我得到了这个错误:严重性代码描述项目文件行错误C2784"未知类型Spiky::GLLayer::_checked_glFunc(RV(__cdecl**)(ARGS…),const char*

有什么建议吗?

您将空令牌连接两次。相反,您需要第二次字符串化,这是用#运算符完成的:

#define SPIKY_GLFUNC(FUNCNAME) 
    ::Spiky::GLLayer::_checked_glFunc(&::gl##FUNCNAME, #FUNCNAME)
//                                                    ^^^
相关文章:
  • 没有找到相关文章