2011-12-20 9 views
0

私のコードでは、複数のデータ型の可能性をどのように扱うべきですか?コンパイル時に異なるデータ型オプションを扱うには?

私はここで、二重またはフロートタイプを使用してコンパイルすることも可能になりたいが、私は現時点では使用したコードは次のとおりです。

#define USE_FLOAT_PRECISION 

... 

#ifdef USE_FLOAT_PRECISION 
    typedef float DATATYPE; 
    #define GL_DATATYPE GL_FLOAT 
#else 
    typedef double DATATYPE; 
    #define GL_DATATYPE GL_DOUBLE 
#endif 

... 

DATATYPE somevar; 
... 
for(...){ 
    for(...){ 
     ... 
     somevar *= (DATATYPE)1.02; // is this good? 
     ... 
    } 
} 

... 

glVertexPointer(3, GL_DATATYPE, ... // can this be done better? 

... 

これはうまく動作しますが、私はでキャストと悪いものがあると感じ(DATATYPE)は、私が使っているすべての場所についても、醜く見えますが、それはすべての場所に貼り付けるのが面倒です。他の解決策?

編集:私は私のコードで倍精度とfloat値を表現したが、その後(フロート)に変換する必要があるため(DATATYPE)にキャスティングについてイム懸念理由は、後には、これにダブルから変換する恐れイムフロートはいくつかの問題を引き起こすでしょう。また、その効率的な、iveがstatic_castがより速いか、何かを聞いたかどうかはわかりません。しかし、どうして私はそれを使うべきなのかわからないし、私はここでそれを使うべきです。

+0

。 DATATYPE_CREATE(0.5)は、アクセスのための関数型マクロの使用のみです。これにより、float型のキャスト以上の実装が可能になります。例えば。ハードウェア浮動小数点のないプラットフォーム上のクラスになる可能性があります。 – Hybrid

+2

はテンプレートの仕事のように聞こえる、いいえ? – stijn

+0

コンパイラは、コンパイル時に定数を浮動小数点に変換する必要があります。また、%fと%Lfを区別するために、sprintfタイプのものを処理するために余分なマクロが必要な場合があります。 – Hybrid

答えて

0

このコードをどこにでも貼り付けるのではなく、ヘッダーに配置して、必要な場所に置くこともできます。

あなたのアプローチはうまくいくでしょうし、あなたが望むものを達成するためのいくつかのアプローチの1つです。

その他のアプローチでは、コードを単純化し、柔軟性を高めるテンプレートを使用することがあります。

+0

ヘッダーはどういう意味ですか?そのマクロ?もちろん。それは私が "このコードをどこにでも貼り付ける"ことを意味していなかった、私は "(DATATYPE)"を使用する可能性のあるフロートの値の前にそれを意味した。それを心配している理由は、ダブルタイプでフロートを表現し、それを再びフロートに変換する必要があるからです。 – Rookie

0

C++ 11には、キャストを簡素化するために使用することができ、ユーザ定義リテラルがあります

私はそれが過去に行っ見てきた正確にどのように非常に多くのです
DATATYPE operator "" _dt(long double x) { 
    return x; 
} 

somevar *= 1.02_dt; 
+0

niiiice、あまりにも悪い私のコンパイラはそれをサポートしません:/また私はどのように効率的であるかわからない、それは私のコードで1.02_dtを使用するたびに関数呼び出しのように動作するのですか?私の編集内容を読み、static_castについてはどうですか?それは良いですか? – Rookie

+0

@Rookieオーバーヘッドがなくなり、 '(DATATYPE)'と 'static_cast 'と同じようにインライン化されます。 'static_cast'はCスタイルのキャストのより特殊なバージョンです。これは同じパフォーマンスですが、より安全です。 – Pubby

関連する問題