[英]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::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
的實現取自站點本身。
在編譯器運行之前,預處理器會處理#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_FLOAT
和GL_DOUBLE
之間進行選擇的特殊情況下, GL_DOUBLE
std::conditional
。 如果出現以下情況,請使用三元
#define GL_MYTYPE std::is_same<MYTYPE,float>::value?GL_FLOAT:GL_DOUBLE
這是因為GL_FLOAT
和GL_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.