2012-06-06 3 views
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++.

ответ

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: keep in ind это не оценивается во время компиляции, но при предварительной обработке.

+0

ах, что имеет больше смысла, чем проверка типов. – Rookie

2

#define s обрабатывается препроцессором перед запуском компилятора. Поэтому он не видит typedef.

0

Вы можете использовать #ifdef следующим образом:

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

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

Вы должны компилировать код с двойной или FLOAT, как определено в symblos.

2

Используйте макросы препроцессора, чтобы изменить то, что делает ваш typedef линия

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

И затем использовать систему сборки для установки TYPE_IS_FLOAT в соответствующий (и дать ему лучшее название, конечно).

Или оберните весь код, который ведет себя подобным образом в классе шаблона, и используйте параметр шаблона для этого типа, а затем используйте подходящую версию в то время.

9

В 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 себя.

0

Я думаю, Nawaz's answer is почти правильный. В специальном случае выбора между 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 также не должно быть typename, но GLenum.Поэтому я предпочел бы использовать:

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