簡體   English   中英

如何在編譯時檢查類型

[英]How to check type on compile time

我可以選擇使用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 ++。

在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的實現取自站點本身。

在編譯器運行之前,預處理器會處理#define 所以它沒有看到typedef

使用預處理器宏來更改typedef行的功能

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

然后使用您的構建系統來適當地設置TYPE_IS_FLOAT (並為其提供更好的名稱)。

或者將所有類似行為的代碼包裝在模板類中,並使用此類型的模板參數,然后使用當時適合的版本。

你可以這樣做:

#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

如果要使用float ,則需要定義MYFLOAT ,或者省略它以使用double

PS:保持在ind中,這不是在編譯時評估,而是在預處理時。

你可以使用#ifdef如下:

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

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

您必須使用DOUBLE或FLOAT編譯代碼作為定義的符號。

我認為Nawaz的答案 幾乎是正確的。 GL_FLOATGL_DOUBLE之間進行選擇的特殊情況下, GL_DOUBLE std::conditional 如果出現以下情況,請使用三元

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM