如何在编译时检查类型

时间:2012-06-06 11:56:12

标签: c++ visual-c++ c-preprocessor

我可以选择使用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 ++。

6 个答案:

答案 0 :(得分:11)

在C ++ 11中,您可以使用std::conditionalstd::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_FLOATGL_DOUBLE之间进行选择的特殊情况下,不需要std::conditional。只需使用ternary if

#define GL_MYTYPE std::is_same<MYTYPE,float>::value?GL_FLOAT:GL_DOUBLE

这是因为GL_FLOATGL_DOUBLE不是类型,而是文字GLenum值。因此GL_MYTYPE也不应该是类型名称,而是GLenum。所以我宁愿使用:

const GLenum GL_MYTYPE = std::is_same<MYTYPE,float>::value?GL_FLOAT:GL_DOUBLE;