curry化三度

関数テンプレートとauto宣言で型推論(推論じゃないけど)。

import std.c.stdio;

class Curry(T, X, Y){
    this(int x0, T delegate(X, Y) f0){
        x = x0;
        f = f0;
    }

    T opCall(Y y){
        return f(x, y);
    }

private:
    X x;
    T delegate(X, Y) f;
}

template curry(T, X, Y) {
    Curry!(T, X, Y) curry(X x, T delegate(X, Y) f) {
        return new Curry!(T, X, Y)(x, f);
    }
}

void main(){
    int hoge(int x, int y){ return x + y; }
    auto f = curry(3, &hoge);
    auto y = f;
    printf("%d, %d\n", f(4), y(2));
}

関数テンプレートの省略記法ないのが気に食わないけどすっきりしている!気にいりました!