イテレータの概念で必要とされる通常のメソッドに加えて、イテレータに非標準のメソッドを含めない理由はありますか? 追加のメソッドは、反復子によって生成されるアイテムの種類に固有のものです。
具体例
私の質問をより具体的にするために、GUI メニューのメニュー項目を操作しています。内部的に、反復子はインデックスによってメニューにアクセスします。逆参照されると、そのインデックスで項目のメニューを照会し、メニューによって返されるプロパティを表す不変オブジェクトを作成し、それへの参照を返す前にメンバー変数にキャッシュします。
安全でない解決策
別の方法として、表現を変更可能にし、プロパティの更新を基になるメニューに書き戻すという方法がありました。次のようになります。
menu m = some_menu();
menu_iterator pos = m.begin() + 3;
menu_item i = *pos;
...
i.caption("foo");
i.disable();
これは、アイテム表現が作成されてからメニューにアイテムが挿入/削除されていない限り、各表現がその位置とメニューへのハンドルを保存する必要があることを意味menu_item
します--大したことではありません--。その場合、プロパティがまったく別のアイテムに変更されるため、あらゆる種類の地獄が解き放たれる可能性があります.
より良い解決策?
したがって、私の考えは、返される値ではなく、プロパティをイテレータに変更するメソッドを追加することでした。こうすることで、ユーザーは、更新されているのは現在ポイントされているアイテムであり、それを無効にする挿入の通常の反復子セマンティクスが適用されることを常に認識しています (実際には無効にはならず、別のアイテムをポイントするだけです)。
menu m = some_menu();
menu_iterator pos = m.begin()+3;
...
pos.caption("foo");
pos.disable();
どう思いますか?