2012-01-28 7 views
1
template<typename T, size_t length> void f(T (&)[length]){ 
    cout<<"array"<<endl; 
} 

template<typename T> void f(T&){ 
    cout<<"generic"<<endl; 
} 

template<typename T, typename enable_if<is_array<T>::value, int>::type =0> void f(T&){ 
    cout<<"generic (is array)"<<endl; 
} 

どのような場合がある(つまり、任意のTf<T>()呼び出し)関数テンプレートの最後のバージョンは、他の人の上に優先されるには?機能テンプレート先番ケース

答えて

2

Tが配列型である場合、最初のバージョンは、第二および第三の機能(特に第二および第三の機能があいまいであろう)勝。 Tが配列型でない場合、enable_ifのおかげで3番目の関数は使用できず、最初の関数は一致しないため、2番目の関数が使用されます。

0

オーバーロードの解決は常にだけでは関数テンプレートであるかどうかに依存しない、関数の引数に取り組んでいます。関数テンプレートでは、関数テンプレートが候補であるかどうかを判断する際に、戻り値の型が過負荷解決の前に使用されます。基本的には、次のように動作します。

  1. 可能な候補機能のセットはビルドされています。おそらく引数と一致するこの関数が考慮されます。関数テンプレートを見ているとき、それはまた、決定された関数テンプレートのインタフェースは、推定された引数とし、機能が過負荷セットに含まれていないいない場合はインスタンス化することができるかどうか。
  2. オーバーロードセットが構築されると、最適な一致が決定されます。これは排他的に引数を調べて、最も多くの変換が必要な候補セットで関数呼び出しを見つけることを試みます。同値がある場合は、テンプレート以外の関数が優先されますが、Cスタイルの可変引数を取る関数が最も優先されません。厳密に1つの一致が見つからない場合、過負荷の解決は失敗し、候補または曖昧さが見つからない。あなたのような場合には

f()の制約のないバージョンと推定されるタイプがT[N]である場合にのみインスタンス化されるように制限された1は、同様に良い試合です。つまり、これらにちょうどT[N]を渡すとあいまいさがあります。しかし、テンプレートのargumetnsが最初のバージョンと一致するように推測された場合、関数テンプレートの部分的な順序付けのためにこれが優先されます。これはより良い一致に終わります。

関連する問題