我有一个自定义迭代器实现(它迭代数据库查询结果,但这与此无关)。它在概念上有两组函数:get
类型函数,它从当前项目(当前行)返回一个值,以及 setup
类型函数(在我的例子中是 bind
s),它在开始迭代之前设置迭代器,因此新的迭代器实例实际上还没有指向第一个项目。还有一个 reset
函数可以使迭代器无效并准备好进行不同的设置。
当其中一个 get
函数被调用时,它首先检查迭代器是否仍然是新的或已被重置(有效地指向 begin()-1
)和如果是,则将其推进到第一项。 get
函数将(应该)是 const
,除了有条件的第一个进步阻止了这一点。
我应该:
- 将它们声明为
const
并为 isReset 标志放入一个mutable
,或者 - 保持原样,并接受这样一个事实,即在后台初始化对象使其成为非
const
,或者 - 用检查初始化状态代替自初始化,让用户在调用任何
get
函数之前调用一次operator++
?<
最佳答案
您的迭代器有状态(即底层数据是否可用),“get”函数会改变该状态。所以这使得它就像任何其他迭代器一样。 “get”函数不应该是常量。顺便说一句,与其调用你的函数“get”,不如让迭代器具有与标准库迭代器相同的接口(interface)——这样你就可以在上面使用标准算法了。因此,请使用 operator*() 和 operator++() 等函数。
关于c++ - 自动初始化和 const 正确性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33587458/