我可以选择使用float或double类型编译程序,但是有一个问题:我需要手动设置GL_FLOAT或GL_DOUBLE,因为我不知道如何执行以下操作:
typedef float MYTYPE;
#if MYTYPE == float
#define GL_MYTYPE GL_FLOAT // used for vertex array parameters.
#else
#define GL_MYTYPE GL_DOUBLE
#endif
注意:我没有C ++ 11或者任何东西,只有好老的C ++。
答案 0 :(得分:11)
在C ++ 11中,您可以使用std::conditional
和std::is_same
作为:
#define GL_MYTYPE std::conditional \
< std::is_same<MYTYPE,float>::value, \
GL_FLOAT, \
GL_DOUBLE \
>::type
在C ++ 03中,您可以自己实现这些功能:
template<bool B, class T, class F>
struct conditional { typedef T type; };
template<class T, class F>
struct conditional<false, T, F> { typedef F type; };
和
template<class T, class U>
struct is_same { static const bool value = false; };
template<class T>
struct is_same<T, T> { static const bool value = true; };
请注意,conditional
的实施取自site本身。
答案 1 :(得分:2)
#define
。所以它没有看到typedef
。
答案 2 :(得分:2)
使用预处理器宏来更改typedef
行的内容
#if defined(TYPE_IS_FLOAT)
typedef float MYTYPE;
#else
typedef double MYTYPE;
#end
然后使用您的构建系统根据需要设置TYPE_IS_FLOAT
(并为其提供更好的名称)。
或者将所有类似行为的代码包装在模板类中,并使用此类型的模板参数,然后使用当时适合的版本。
答案 3 :(得分:1)
你可以这样做:
#define MYFLOAT
#ifdef MYFLOAT
typedef float MYTYPE;
#define GL_MYTYPE GL_FLOAT // used for vertex array parameters.
#else
typedef double MYTYPE;
#define GL_MYTYPE GL_DOUBLE
#endif
如果您要使用MYFLOAT
,则需要定义float
,或者省略它以使用double
。
PS:保留在ind中,这不是在编译时评估,而是在预处理时评估。
答案 4 :(得分:0)
您可以使用#ifdef,如下所示:
#ifdef DOUBLE
#define GL_MYTYPE GL_FLOAT
//or
typdef ...
#endif
#ifdef FLOAT
#define GL_MYTYPE GL_DOUBLE
//or
typdef ...
#endif
您必须使用DOUBLE或FLOAT编译代码作为定义的符号。
答案 5 :(得分:0)
我认为Nawaz's answer 几乎正确。在GL_FLOAT
和GL_DOUBLE
之间进行选择的特殊情况下,不需要std::conditional
。只需使用ternary if:
#define GL_MYTYPE std::is_same<MYTYPE,float>::value?GL_FLOAT:GL_DOUBLE
这是因为GL_FLOAT
和GL_DOUBLE
不是类型,而是文字GLenum
值。因此GL_MYTYPE
也不应该是类型名称,而是GLenum
。所以我宁愿使用:
const GLenum GL_MYTYPE = std::is_same<MYTYPE,float>::value?GL_FLOAT:GL_DOUBLE;