boost::lambda な無名関数の戻り値の型が知りたい
諸事情で
template<typename IT, typename FN>
typename FN::result_type my_for_each(IT itBegin, IT itEnd, FN fn)
{
// ごにょごにょ
}
こんな事がやりたくなったのですよ。
std::mem_fun / boost::bind が fn に投げられる時は、FN に result_type が typedef されているので問題ないのですが、boost::lambda のλ式には result_type は定義されていないようで、コレではコンパイルが通らないのです。
仕方ないので、λ式を構成している boost::lambda::lambda_functor の operator () を見て、戻り値の型をどうやって決定しているかを見てみたのです。…が
// lambda_functors.hpp の 142行目ぐらい
// lambda_functor::operator の 引数1つバージョン
template<class A>
typename inherited::template sig<tuple<A&> >::type
operator()(A& a) const {
return inherited::template call<
typename inherited::template sig<tuple<A&> >::type
>(a, cnull_type(), cnull_type(), cnull_type());
}
// lambda_functor::opertaor の 引数2つバージョン
template<class A, class B>
typename inherited::template sig<tuple<A&, B&> >::type
operator()(A& a, B& b) const {
return inherited::template call<
typename inherited::template sig<tuple<A&, B&> >::type
>(a, b, cnull_type(), cnull_type());
}
お前は何を言っているんだ?
…え…えーっとぉ…?
templatetypename inherited::template sig >::type
これが戻り値の型であることは確かなのですが…
sig? tuple? 再起呼び出し…?*1
………だめや解らん。orz
lambda_functor::sig<T>::type で取れそうではあるのですが、T に何を渡していいかがサッパリ解らず……
うー。my_for_each のテンプレート引数として戻り値の型を取るようにするとか、回避策をとるしかないかなぁー。
余談
よくよく考えてみると、λ式って opertaor () を呼び出すまで戻り値の型って決定できないんですよね。多分。
(bll::_1 + 1)(169); // int
(bll::_1 + 1)(2.5f); // float
(bll::_1 + 1)(3.14); // double
こんな感じで渡す引数によって、型が変わってしまう。
となると、私が求めている形での result_type ってのは提供できないのが正解なんだろうなぁ。 多分。
さーて、どうしようかしらー
*1:sig / tuple の type が内部で再起してる