5

我提供了使用 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++。

4

6 回答 6

11

在 C++11 中,您可以将std::conditionalandstd::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取自网站本身。

于 2012-06-06T12:07:00.313 回答
2

#defines 在编译器运行之前由预处理器处理。所以它看不到typedef.

于 2012-06-06T12:00:03.830 回答
2

使用预处理器宏来改变你的typedef行的作用

#if defined(TYPE_IS_FLOAT)
typedef float MYTYPE;
#else
typedef double MYTYPE;
#end

然后使用你的构建系统进行TYPE_IS_FLOAT适当的设置(当然给它一个更好的名字)。

或者将所有类似行为的代码包装在模板类中,并为此类型使用模板参数,然后使用当时合适的版本。

于 2012-06-06T12:00:31.543 回答
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 这不是在编译时评估的,而是在预处理时评估的。

于 2012-06-06T12:02:37.933 回答
0

您可以使用 #ifdef 如下:

#ifdef DOUBLE
   #define GL_MYTYPE GL_FLOAT
   //or
   typdef ...
#endif

#ifdef FLOAT
   #define GL_MYTYPE GL_DOUBLE
   //or
   typdef ...
#endif

您必须使用 DOUBLE 或 FLOAT 作为定义的符号来编译代码。

于 2012-06-06T12:00:13.883 回答
0

我认为纳瓦兹的回答几乎是正确的。在 和 之间进行选择的特殊情况下GL_FLOATGL_DOUBLE不需要std::conditional。只需使用三元 if

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

这是因为GL_FLOATandGL_DOUBLE不是类型,而是文字GLenum值。所以GL_MYTYPE也不应该是一个类型名,而是一个GLenum. 所以我宁愿使用:

const GLenum GL_MYTYPE = std::is_same<MYTYPE,float>::value?GL_FLOAT:GL_DOUBLE;
于 2015-11-13T15:55:29.663 回答