引数に関数オブジェクトを取るテンプレート関数の戻り値の型が,その引数の関数オブジェクトの戻り値の型に依存することはしばしばある(変なギミックの付いたライブラリとか書くと特に).関数プログラミングよろしく結果のオブジェクトを作って返すような関数を作っているときには戻り値の型をどうにか推論しないといけない.
んで,どうやって推論したもんかなぁとか思ってたら c++0x なら std::result_of が使えることを発見.これ使うと,例えば vector の要素に関数適用して新しい vector 返すとかいう関数がこう書ける(vector 返すとかバカなプログラムだなぁ.例だからいいか.):
template <typename F, typename A> std::vector<typename std::result_of<F(A)>::type> map(const F& f, const std::vector<A> &v) { std::vector<typename std::result_of<F(A)>::type> r; for(auto it = v.begin(); it != v.end(); it++) r.push_back(f(*it)); return r; }
std::result_of 無しだと関数オブジェクトに戻り値の型をtypedefさせるかテンプレート引数増やして明示してもらうかしないとならんと思うので std::result_of は結構便利なんじゃないかと思った今日この頃.コードがすっきりしているかどうかは判断が難しいけど.
- Newer: AWK - はじめ