なんとなく
上の報告書を書きながら Linq みたいなことを C++/CLI でやるにはどうするんだろうとか、考えてました。
構文に関しては、 for each を前提に考えてみます。なぜかというと、C++/CLI では 唯一、制御文でありながら IEnumerable の実装を前提としたループを行うものだからです。
その実装は次のようになります。
{
try {
e =
while ( e->MoveNext() ) {
T d = safe_cast
statement
}
} finally {
delete e;
}
}
これはつまり、for each は単なるシンタックス・シュガーであり、コンパイル時には上記のように展開されることを示しています。
まぁ、ぶっちゃげ、IEnumerable を実装した中間クラスを作って渡してやれば、まねごとみたいなことはできるんじゃないかと。
for each ( String^ name in gcnew Sort(key_map) ) {...}
こんな感じ。後は、コンディションをいかに渡すか、になるんでしょうね。
うーん、なんか、微妙にできそうな。
えーっと、基底クラスで Where とか、Condition とか、Sort とかを用意して、virtual 関数で明示的に条件を上書きすれば、順次アクセス可能なオブジェクトに対してはいけないかな。