2012-02-20 13 views
0


テンプレートクラスの関数でfloat to bool変換のパフォーマンス警告を削除したいと考えています。この場合、boost::enable_ifは過剰な感じです。C++テンプレートクラスのパフォーマンス警告を削除します

は多分、コンパイル時にテンプレートの種類を確認して、種類に応じて適切なキャストを使用する方法がありますか?私は警告を無効にしたくない

#if (boost::is_same<CType, bool>::value == true) 
     val = (val+val2)!=0; 
    #else 
     val = (T)(val+val2); 
    #endif 


T val; 
    float val2; 
    val = (T)(val+val2); // warning here for objects of type bool 


は、私はこのような何かをしたいです。

編集:追加されましたVisual Studioのタグ

+0

スタックオーバーフローへようこそ!コンパイラ警告は、使用しているコンパイラに固有の警告です。この質問にはコンパイラに適切なタグを付けてください。 –

+2

bool型のテンプレートを特殊化できます。 – Collin

+0

おかげでコリンが、1回の警告を修正するための特殊化を作成するには、私にはやり過ぎのビットのように思えます。確かに便利な方法があるはずですか? – s0ndeb0k

答えて

6

あなたが別のテンプレートにアウト操作を引き、そしてboolのための過負荷可能性:

template <typename T1, typename T2> 
T1 add(T1 const & v1, T2 const & v2) { 
    return static_cast<T1>(v1 + v2); 
} 

template <typename T2> 
bool add(bool v1, T2 const & v2) { 
    return (v1 + v2) != 0; 
} 

T val; 
float val2; 
val = add(val,val2); // hopefully no warning now. 
2

だけのために「特化」するかのブロックにis_sameを使用ブールBoostを使用したくない場合に備えて、標準ライブラリの一部です。

template<typename T> 
void foo(T val1) { 
    T val; 
    float val2; 

    if (std::is_same<T, bool>::value == true) 
     val = (val1 + val2) != 0; 
    else 
     val = val1 + val2; 
} 

コンパイラが分岐を最適化して、実際のテンプレートの特殊化と同じ結果を得ると期待します。

関連する問題