c++ - 没有模板的运算符重载

标签 c++ c++11 iterator operator-overloading

<分区>

到目前为止,作为 C++ 新手,我在重载方面的经验仅限于复制、移动赋值运算符以及 I/O 流运算符。

我现在必须为解析树节点类创建一个迭代器,这意味着我必须重载以下内容:

  1. ==
  2. *(取消引用运算符)
  3. ++
  4. --
  5. >=

我一直在网上搜索以及几本 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/

相关文章:

c++ - 为 "Humble Dialogs"创建 View 的方法

c++ - 由于 #define MAX 在 C++ 中出错

python - Python 的 C++ 编译器支持 C++11(MinGW 和 MSVC)(也是 cl.exe fatal error )

python - StopIteration 异常是否会自动通过我的迭代器向上传播?

java - 为什么迭代器仍然存在于java中

c++ - 有没有办法丢弃空捕获?

c# - 为 DLL 制作 .NET 包装器

c++ - 对象创建的外包

c++ - 有什么方法可以欺骗 std::make_shared 使用默认初始化吗?

c++ - enable_if 方法特化