C++0xでのカリー化
をしてみたくて書いてみたけど、暗黙の型変換がなぜかされなくて悲しい。コードはこんな感じ
#include <iostream> #include <functional> template < typename Ret, typename Head, typename... Tail > inline auto curry( const std::function< Ret( Head, Tail... ) > &fn, Head arg ) -> std::function< Ret( Tail... ) > { return [=]( Tail... args ) -> Ret { return fn( arg, args... ); }; } inline auto add_static( int a, int b ) -> int { return a + b; } auto main( void ) -> int { { std::function< int( int, int ) > add = []( int a, int b ) -> int { return a + b; }; auto add4 = curry( add, 4 ); std::cout << add4( 1 ) << std::endl; } { std::function< int( int, int ) > add = add_static; auto add4 = curry( add, 4 ); std::cout << add4( 1 ) << std::endl; } return 0; }
autoで拾おうとするとmain::
auto main( void ) -> int { { auto add4 = curry( []( int a, int b ) -> int { return a + b; }, 4 ); std::cout << add4( 1 ) << std::endl; } { auto add4 = curry( add_static, 4 ); std::cout << add4( 1 ) << std::endl; } return 0; }
やっぱこう書けたほうがスマートなんだがなぁ。書きたいよねー。どうにかならんのかな。
ちなみに環境はGCC4.6.0 20100629