如何在编译时检查类型

Roo*_*kie 5 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
Run Code Online (Sandbox Code Playgroud)

注意:我没有C++ 11或者任何东西,只有好的旧C++.

Naw*_*waz 11

在C++ 11中,您可以使用std::conditionalstd::is_sameas:

#define GL_MYTYPE  std::conditional                       \
                   <  std::is_same<MYTYPE,float>::value,  \
                      GL_FLOAT,                           \
                      GL_DOUBLE                           \
                   >::type                            
Run Code Online (Sandbox Code Playgroud)

在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; };
Run Code Online (Sandbox Code Playgroud)

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; };
Run Code Online (Sandbox Code Playgroud)

请注意,实现conditional取自网站本身.


m0s*_*it0 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
Run Code Online (Sandbox Code Playgroud)

您需要定义MYFLOAT是否要使用float,或者省略它以使用double

PS:保留在 ind 中,这不是在编译时评估,而是在预处理时评估。