自动初始化和常量正确性

3
我有一个自定义迭代器实现(它遍历数据库查询结果,但这与本题无关)。从概念上讲,它具有两组函数:get类型的函数,它们从当前项目(当前行)返回值,和setup类型的函数(在我的情况下是bind),它们在开始迭代之前设置迭代器,因此新的迭代器实例实际上还没有指向第一个项目。还有一个reset函数,它将迭代器置空并准备以不同的方式进行设置。
当调用其中一个get函数时,它首先检查迭代器是否仍然是新的或已被重置(有效地指向begin()-1),如果是,则将其推进到第一个项目。get函数应该是const的,但是这个条件性的推进阻止了这一点。
我应该:
  1. 声明它们为const并加入一个mutable用于isReset标志,或者
  2. 保持原样,并接受在对象初始化时它变成了非const的事实,或者
  3. 用初始化状态检查替换自初始化,并让用户在调用任何get函数之前调用operator++一次?

一个全新的迭代器,在没有进行任何get...调用的情况下是否可以等于end() - 6502
1个回答

2

您的迭代器具有状态(即底层数据是否可用),而“get”函数会改变该状态。因此,它就像任何其他迭代器一样。 “get”函数不应为const。顺便说一下,与其称呼您的函数为“get”,不如使迭代器具有与标准库迭代器相同的接口-然后您可以在其上使用标准算法。因此,使用operator*()和operator++()等函数。


我确实使用operator++()。至于operator*(),get函数还需要一个列参数,并且对于获取不同类型(getInt()、getString()等)的不同函数也有不同的函数,所以这并不简单。 - Baruch
我理解你关于不同类型的get的观点。我在想operator*()最好返回一种“Record”或“Row”类,该类具有必要的get*(n)函数。 - Klitos Kyriacou
你可能想看一下其他人是如何解决这个问题的;例如 sqlpp11 - https://github.com/rbock/sqlpp11 - Klitos Kyriacou

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接