除了迭代器概念所需的常规方法之外,是否有任何理由不在迭代器中包含非标准方法?附加方法将特定于迭代器生成的项目类型。
具体例子
为了使我的问题更具体,我正在对 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();
你怎么看?