2016-10-23 3 views
4

複数の鋳造ルールC++

std::transform (source.begin(), source.end(), // start and end of source 
      dest.begin(),     // start of destination 
      (int(*)(int const&)) addValue<int,5>); // operation 

は、誰かがaddValueは非型関数テンプレートが

template <typename T, int VAL> 
    T addValue (T const& x) 
    { 
     return x + VAL; 
    } 

として感謝しているキャスト、

(int(*)(int const&)) 

を打破することができます。

答えて

4

キャストは、「int const&を取得し、intを返す関数へのポインタ」タイプのタイプint(*)(int const&)へのキャストです。 addValue<int, 5>ので

は既にタイプ「機能がint const&を取り、intを返す」を有する(および値によって渡されたときにポインタを機能するように減衰する)、キャストは、この文脈では不要です。

このようなキャストが有用な場合の例は、同じ名前を持つ複数の関数テンプレート間の曖昧さを排除することです。示さaddValue定義に加えて、我々はまた、これを持っていた、場合:

template <typename T, int VAL> 
void addValue(T& x) { 
    x += VAL; 
} 

を、その後一人でaddValue<int, 5>を指定すると、あいまいになります。どのようなタイプのaddValueが、void addValue<int, 5>(int&)の代わりにint addValue<int, 5>(int const&)の代わりに使用するように指示されているかをコンパイラに伝えると、どのテンプレートを選択するのかがわかります。

+0

すばやく返信いただきありがとうございます。うわー、関数ポインタ。 – has