そろそろVisual Studio 2005 RCの足音も聞こえてくる今日この頃、気になってちょっとC#2.0を調べてみました。記事1、記事2
Genericsで重要なのは、以下の3つだと思います。
1. 型のパラメタライズ
2. 特殊化
3. 型の制約記述
C++のテンプレートは1と2をサポートし、JavaのGenericsは1と3をサポートします。
2の特殊化がC++のテンプレートに取り入れられた理由は、テンプレートの「オーバーロード」(例えば、組込型とオブジェクト型で違うコードを使ってほしいといった要求に応える)を可能にするためでした。その後、特殊化は再帰テンプレートという技術に応用され、コンパイル時に計算されるコードの記述に使われることになりました。
3の型の制約記述は、テンプレートを型システムと整合させる(単なるマクロの代替として使うのではなく)のに重要な機能ですが、C++ではサポートしていません。
上述の記事を読む限り、C#2.0のテンプレートは1, 2, 3のすべてをサポートするようです。C#2.0のテンプレートがちゃんと機能して、うまくは流行れば、そのうちメタテンプレートライブラリがごそっと移植されて・・・うーん。後はMonoProjectがC#2.0に追いついてくれればなあ・・・。(MonoProject、いつの間にか、2.0の実装をほぼ完了“almost complete for 2.0”だそうです。早い。2005/10/06)
追記 2005/10/13
記事「動的プログラミング言語へと発展するC# 3.0とVB 9.0」によると、どうやら、C#3.0では、独自の道を行こうとしているようです。上記1, 2, 3にくわえて、型推論、および、ラムダやLINQといったこってりしたシンタックスシュガー。ここまでくると、本格的に、コンパイラのエラーメッセージが可読かどうか気になる・・・
Genericsで重要なのは、以下の3つだと思います。
1. 型のパラメタライズ
2. 特殊化
3. 型の制約記述
C++のテンプレートは1と2をサポートし、JavaのGenericsは1と3をサポートします。
2の特殊化がC++のテンプレートに取り入れられた理由は、テンプレートの「オーバーロード」(例えば、組込型とオブジェクト型で違うコードを使ってほしいといった要求に応える)を可能にするためでした。その後、特殊化は再帰テンプレートという技術に応用され、コンパイル時に計算されるコードの記述に使われることになりました。
3の型の制約記述は、テンプレートを型システムと整合させる(単なるマクロの代替として使うのではなく)のに重要な機能ですが、C++ではサポートしていません。
上述の記事を読む限り、C#2.0のテンプレートは1, 2, 3のすべてをサポートするようです。C#2.0のテンプレートがちゃんと機能して、うまくは流行れば、そのうちメタテンプレートライブラリがごそっと移植されて・・・うーん。
追記 2005/10/13
記事「動的プログラミング言語へと発展するC# 3.0とVB 9.0」によると、どうやら、C#3.0では、独自の道を行こうとしているようです。上記1, 2, 3にくわえて、型推論、および、ラムダやLINQといったこってりしたシンタックスシュガー。ここまでくると、本格的に、コンパイラのエラーメッセージが可読かどうか気になる・・・