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