2012-03-01 3 views
2

、私は(そうでない場合、私は私たちのプロジェクトのためのエラーとして扱われ、警告を取得)キャストで雑然と方法で終わるC++で混乱をキャスト削減:は、一般的なクラスをプログラミングする場合

template <typename floatType> 
class foo 
{ 
public: 
    typedef floatType real_type; 

    real_type bar() 
    { 
    real_type a = (real_type)0.5; // should I be using static_cast? Either way, the code becomes cluttered quickly 
    real_type b = a + 0.6; // warning here for floatType = float 

    real_type someLongEquation = a + ((real_type)0.5 * (real_type)100) + (real_type)17.0; 

    return a + b + someLongEquation; 
    } 
}; 

int main() 
{ 
    { 
    foo<float> z; 
    z.bar(); 
    } 

    { 
    foo<double> z; 
    z.bar(); 
    } 

    return 0; 
} 

にどのような方法がありますその混乱を減らす?

someLongEquationで魔法の定数を使用しています。私がそれらを分けても、混乱が増えます。いずれにせよ、それは質問のポイントではありません:)

+0

警告は何ですか? –

+0

@DavidBrown: 'double 'から' float 'への変換、データの損失の可能性があります。精度の損失を招くおそれのあるビルトインタイプ間のキャストの標準です。 – Samaursa

+0

各定数の後ろに' f'を置くだけです。 floatをdoubleに割り当てることは大丈夫です;) – nullpotent

答えて

0

単純な方法は、コードの周りの警告をオフにすることです。 MSVCで:

#pragma warning(push) // save warnings state 
#pragma warning(disable:4244) // narrowing conversion 
// code here ... 
#pragma warning(pop) // restore warnings 

より良い方法は、しかし、あなたは魔法の定数のdoubleの拡張精度を必要としない場合だけfloatリテラルを使用することです。浮動小数点リテラルにfを追加するだけで問題ありません。また、キャストは100には必要ありません。実際に正確さが必要な場合は、警告を無効にすることに戻ります。

0

マジック定数を分離して、適切なジェネリック型で保存する必要があります。すべてのキャスティングはその場所に限定されます。 C++ 11では、非整数const staticsのクラス初期化が簡単にできるようになりました。

template <typename floatType> 
class foo 
{ 
public: 
    typedef floatType real_type; 

    static constexpr real_type A = real_type(0.5); 
    static constexpr real_type B = real_type(0.6); 
    static constexpr real_type C = real_type(100.0); 
    static constexpr real_type D = real_type(17.0); 

    real_type bar() 
    { 
    real_type a = A; 
    real_type b = a + B; 

    real_type someLongEquation = a + (A * C) + D; 

    return a + b + someLongEquation; 
    } 
}; 
+0

IIRC、C++ 11では、非静的メンバーの場合にのみ許可されています。 – Xeo

+0

@Xeo前に参照を見つけることができませんでしたが、今は持っています。静的なconstexprデータメンバーは 'literal type '(浮動小数点型を含む)を持つ場合、クラス内で初期化することができます。 [class.static.data]§9.4.2/ 3 – bames53

+0

ああ、私は何とか 'constexpr'を見落としました。 :) – Xeo

関連する問題