Boost.Bind を C# で作りたい(2)

とりあえず全部の引数を束縛するのであれば簡単に作れるようだ。

delegate R Function<R>();
delegate R Function<R, T1>(T1 t1);
delegate R Function<R, T1, T2>(T1 t1, T2 t2);
// 以下略

Function<R> Bind<R>(Function<R> f)
{
    return delegate { return f(); };
}
Function<R> Bind<R, T1>(Function<R, T1> f, T1 t1)
{
    return delegate { return f(t1); };
}
Function<R> Bind<R, T1, T2>(Function<R, T1> f, T1 t1, T2 t2)
{
    return delegate { return f(t1, t2); };
}
// 以下略

でもこれだと、

int func(int n) { return 0; }

Function<int> f = Bind(func, 100);

と書くと

'Bind(Function, T1)' に対する型引数を使い方から推論することはできません。型引数を明示的に指定してください。

って出る。ダメポ。


そしてプレースホルダーをどうやって実装するかってのもある。さてさて。


そういえば今は C#2.0 使ってるけど、C#3.0 には Boost.Bind みたいな機能って無いのかなぁ……。