Boost.Lambda.Bind 時に引数型で戻り値型を決定する

Boost.Bind だと、Bind 時に戻り値型を決定する必要があります。
ですので、引数型で戻り値型を決定することが出来ません。
引数型で戻り値型を決定する場合は、Boost.Lambda.Bind を使用すれば解決します。

#include <boost/lambda/bind.hpp>
#include <boost/lambda/lambda.hpp>
#include <boost/bind.hpp>
#include <boost/typeof/typeof.hpp>

#include <iostream>

struct add{
//  typedef ??? result_type;    // 引数型で変わるので決定できない
    template<typename Args>
    struct sig{
        typedef typename boost::tuples::element<1, Args>::type type;
    };
    template<typename T>
    T operator()(T a, T b) const{
        return a + b;
    }
};

int
main(){
    // bind 時に戻り値型を決定しなければいけない
    // BOOST_AUTO(f1, boost::bind(add(), _1, _1));

    using boost::lambda::_1;
    BOOST_AUTO(f, boost::lambda::bind(add(), _1, _1) );
    std::cout << f(10) << std::endl;
    return 0;
}

[出力]

20


Boost.Lambda.Bind の場合は関数オブジェクト内に template sig を定義してやれば、引数型が Boost.Tuple で渡されるので、それを利用して戻り値型を決定してやることが出来ます。


[boost]
ver 1.46.1
[参照]
http://www.boost.org/doc/libs/1_46_1/doc/html/lambda/le_in_details.html#lambda.function_objects_as_targets