2012-06-06 15 views
5

estoy dando opción de compilar el programa, ya sea con flotador o tipo doble, pero hay un problema: Tengo que configurar manualmente o bien GL_FLOAT o GL_DOUBLE, porque no sé cómo puedo hacer lo siguiente:Cómo comprobar el tipo en tiempo de compilación

typedef float MYTYPE; 

#if MYTYPE == float 
    #define GL_MYTYPE GL_FLOAT // used for vertex array parameters. 
#else 
    #define GL_MYTYPE GL_DOUBLE 
#endif 

Nota: No tengo C++ 11 o en absoluto, solo el buen viejo C++.

Respuesta

1

Usted puede hacerlo de esta manera:

#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 

Usted tendría que definir MYFLOAT si desea utilizar float, u omitirlo para poder utilizar double.

PS: tener en ind esto no se evalúa en tiempo de compilación, pero en el momento de pre-procesamiento.

+0

ah, eso tiene más sentido que consultar tipos. – Rookie

2

#define s son procesados ​​por el preprocesador, antes de que acabe el compilador. Por lo tanto, no ve el typedef.

0

Usted puede usar #ifdef de la siguiente manera:

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

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

Usted tiene que compilar el código con doble o flotar como los symblos definidos.

2

utilizar macros del preprocesador para cambiar lo que hace su línea de typedef

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

y luego usar su sistema de construcción para establecer TYPE_IS_FLOAT según el caso (y darle un nombre mejor, por supuesto).

o envuelva todo el código que se comporta como esto en una clase de plantilla y utilizar un parámetro de plantilla de este tipo, a continuación, utilizar la versión que es apropiado en el momento.

9

En C++ 11, puede utilizar std::conditional y std::is_same como:

#define GL_MYTYPE std::conditional      \ 
        < std::is_same<MYTYPE,float>::value, \ 
         GL_FLOAT,       \ 
         GL_DOUBLE       \ 
        >::type        

En C++ 03, puede implementar estas funcionalidades a sí mismo como:

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; }; 

y

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; }; 

Nota que la aplicación de conditional se toma de la site sí mismo.

0

Creo Nawaz's answer es casi correcta. En el caso especial de elegir entre GL_FLOAT y GL_DOUBLE, std::conditional no es necesario. Sólo tiene que utilizar un ternary if:

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

Esto se debe a GL_FLOAT y GL_DOUBLE no son tipos, sino literales GLenum valores. Por lo tanto, GL_MYTYPE tampoco debe ser un nombre de tipo, sino un GLenum.Así que prefiero usar:

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