<分区>
到目前为止,作为 C++ 新手,我在重载方面的经验仅限于复制、移动赋值运算符以及 I/O 流运算符。
我现在必须为解析树节点类创建一个迭代器,这意味着我必须重载以下内容:
- ==
- *(取消引用运算符)
- ++
- --
- >=
我一直在网上搜索以及几本 C++ 书籍,但到目前为止我没有适合我的特定情况的东西(即不引用模板),但是我了解到递增和递减运算符需要重载“两次”对于后缀和前缀的情况
谁能解释一下如何做到这一点以及背后的原因
谢谢你:)
如果偏离主题,我深表歉意。
<分区>
到目前为止,作为 C++ 新手,我在重载方面的经验仅限于复制、移动赋值运算符以及 I/O 流运算符。
我现在必须为解析树节点类创建一个迭代器,这意味着我必须重载以下内容:
我一直在网上搜索以及几本 C++ 书籍,但到目前为止我没有适合我的特定情况的东西(即不引用模板),但是我了解到递增和递减运算符需要重载“两次”对于后缀和前缀的情况
谁能解释一下如何做到这一点以及背后的原因
谢谢你:)
如果偏离主题,我深表歉意。
最佳答案
您可能想看一下 boost::iterator_facade
来自 Boost.Iterator图书馆。
这会让你定义成员函数equal()
, derefence()
, increment()
, decrement()
, advance()
和 distance()
.然后,图书馆将从这些成员中生成 ==
, !=
, *
, ++
, --
, +=
, -=
, []
和关系运算符 <
, >
, <=
, >=
给你。
您也可以手动定义它,但正如您所指出的,有很多代码重复(相等和不等、递增前和递增后)。此外,迭代器还需要访问某些 typedef 和仔细定义的返回类型以及临时对象的生命周期管理,以便与标准库一起使用。 Boost.Iterator 将以直接的方式为您处理所有这些细节。
linked-list iterator 有一个有效的例子您可以尝试适应树迭代器。
注意:没有必要自己定义模板,但迭代器外观本身就是一个模板,然后您可以用树类的特定类型实例化它。
关于c++ - 没有模板的运算符重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22629187/