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 ++だけです。

4

6 に答える 6

11

std::conditionalC++11 では、 andstd::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から取得されることに注意してください。

于 2012-06-06T12:07:00.313 に答える
2

#defines は、コンパイラが実行される前に、プリプロセッサによって処理されます。したがって、 は表示されませんtypedef

于 2012-06-06T12:00:03.830 に答える
2

プリプロセッサ マクロを使用してtypedef行の動作を変更する

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

そして、ビルド システムを使用しTYPE_IS_FLOATて適切に設定します (もちろん、より適切な名前を付けます)。

または、このように動作するすべてのコードをテンプレート クラスにラップし、この型のテンプレート パラメーターを使用してから、その時点で適切なバージョンを使用します。

于 2012-06-06T12:00:31.543 に答える
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使用しない場合は定義する必要があります。floatdouble

PS: これはコンパイル時に評価されず、前処理時に評価されます。

于 2012-06-06T12:02:37.933 に答える
0

次のように #ifdef を使用できます。

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

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

定義されたシンボルとして DOUBLE または FLOAT を使用してコードをコンパイルする必要があります。

于 2012-06-06T12:00:13.883 に答える
0

Nawazの答えほぼ正しいと思います。GL_FLOATと の間を選択する特殊なケースではGL_DOUBLEstd::conditionalは必要ありません。次の場合は三項を使用してください。

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

これは、GL_FLOATandGL_DOUBLEが型ではなく、リテラルGLenum値であるためです。したがってGL_MYTYPE、型名ではなくGLenum. だから私はむしろ使用したい:

const GLenum GL_MYTYPE = std::is_same<MYTYPE,float>::value?GL_FLOAT:GL_DOUBLE;
于 2015-11-13T15:55:29.663 に答える