2016-10-15 4 views
1

全身。 私はC++のコードを読んでいましたが、私はこの2つのテンプレートに直面しています。
最初:C++ - autoおよびdecltypeの代替品

template <class T> 
float wrap_360(const T angle, float unit_mod) 
{ 
    const float ang_360 = 360.f * unit_mod; 
    float res = fmodf(static_cast<float>(angle), ang_360); 
    if (res < 0) { 
     res += ang_360; 
    } 
    return res; 
} 

2つ目は、次のとおりです。

template <class T> 
auto wrap_360_cd(const T angle) -> decltype(wrap_360(angle, 100.f)) 
{ 
    return wrap_360(angle, 100.f); 
} 

最初のものは私にとって明白であるが、2番目の1が言いたい正確に何??

実際、私のコンパイラはC++ 11をサポートしていないので、 "auto"と "decltype"は認識しません。

このコードをUnder C++ 11コンパイラで理解できるように変更するにはどうすればよいですか?

助けがあれば助かります。 ありがとうございます。

+0

どのC++コンパイラを使用していますか? –

+1

暗闇から抜け出す。これは技術、情報学です。進む。 – DeiDei

+5

'wrap_360()'は、引数型 'T'に依存しない' float'を返します。これが唯一のオーバーロードであれば、 'float wrap360_cd(const T angle)'を使うことができます。 –

答えて

4

この場合、decltype()の使用は冗長に見えます。あなたは、次のと、第2の機能を置き換えることができる必要があります:以下の今後の参考のために

template <class T> 
float wrap_360_cd(const T angle) 
{ 
    return wrap_360(angle, 100.f); 
} 

コードを - >あなたの関数の戻り値の型は、オートを使用して指定された場合に必要とされる末尾の戻り値の型と呼ばれ、これは戻り値の型を指定するためにdecltype()を使用する場合などに便利ですが、この場合は既にwrap_360()関数の戻り値の型を知っているので必要ありません。