boost::lambda な無名関数の戻り値の型が知りたい

諸事情で



template<typename IT, typename FN>
typename FN::result_type my_for_each(IT itBegin, IT itEnd, FN fn)
{
    // ごにょごにょ
}

こんな事がやりたくなったのですよ。

std::mem_fun / boost::bindfn に投げられる時は、FNresult_type が typedef されているので問題ないのですが、boost::lambdaλ式には result_type は定義されていないようで、コレではコンパイルが通らないのです。

仕方ないので、λ式を構成している boost::lambda::lambda_functoroperator () を見て、戻り値の型をどうやって決定しているかを見てみたのです。…が



// 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()); 
}


お前は何を言っているんだ?



…え…えーっとぉ…?

template
typename 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 が内部で再起してる