にゃははー

はへらー

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::からstd::functionにしてくれないし、int(&)(int,int)から同じようにstd::functionにしてくれない。

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