在C++11#中检查类型定义

Checking types in C++11 #defines

本文关键字:类型 定义 检查 C++11#      更新时间:2023-10-16

我想根据typedef的值进行预处理器定义。

其思想是检查index_type_t并生成适当的INDEX_TYPE_GL定义。

以下内容无法按预期工作。

typedef uint32_t index_type_t;
#ifdef INDEX_TYPE_GL
#undef INDEX_TYPE_GL
#endif
#if (index_type_t == uint8_t)
#define INDEX_TYPE_GL   GL_UNSIGNED_BYTE
#elif (index_type_t == uint32_t)
#define INDEX_TYPE_GL   GL_UNSIGNED_INT
#elif (index_type_t == uint16_t)
#deine INDEX_TYPE_GL    GL_UNSIGNED_SHORT
#endif

注意,uint8_tuint16_tuint32_t在其他地方是单独的typdefs,并且GL_UNSIGNED_BYTE等是整数值,而不是类型。

枚举样式:

template<typename T> struct IndexTypeGL {};
template<> struct IndexTypeGL<uint8_t>  { enum {value = GL_UNSIGNED_BYTE }; };
template<> struct IndexTypeGL<uint16_t> { enum {value = GL_UNSIGNED_SHORT}; };
template<> struct IndexTypeGL<uint32_t> { enum {value = GL_UNSIGNED_INT  }; };
#define INDEX_TYPE_GL  IndexTypeGL<index_type_t>::value

"static constexpr"样式

template<typename T> struct IndexTypeGL {};
template<> struct IndexTypeGL<uint8_t>  { static constexpr int value = GL_UNSIGNED_BYTE; };
template<> struct IndexTypeGL<uint16_t> { static constexpr int value = GL_UNSIGNED_SHORT;};
template<> struct IndexTypeGL<uint32_t> { static constexpr int value = GL_UNSIGNED_INT;  };