检查C ++ 11 #defines中的类型

时间:2013-08-19 11:08:56

标签: c++ c++11 typedef

我想根据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在其他地方是typdefsGL_UNSIGNED_BYTE等是整数值,而不是类型。

1 个答案:

答案 0 :(得分:5)

枚举式:

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

“静态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;  };