c++ - 通过 BOOST_FOREACH 使我的 C++ 类可迭代

标签 c++ design-patterns iterator

我有一个类,我想公开一个结构列表(其中只包含一些整数)。 我不想让外界修改这些数据,只是遍历它并读取它们 示例:

struct TestData
{
  int x;
  int y;
  // other data as well
}

class IterableTest
{
  public:
    // expose TestData here
};

现在在我的代码中我想像这样使用我的类:

IterableTest test;
BOOST_FOREACH(const TestData& data, test.data())
{
  // do something with data
}

我已经读过这篇文章http://accu.org/index.php/journals/1527关于成员(member)空间。 但是,我不想(或不能)将所有 TestData 保存在内部 vector 或其他东西中。 这是因为类本身不拥有存储,即实际上没有可以由类直接访问的底层容器。不过,该类本身可以查询外部组件以获取下一个、上一个或第 i 个元素。

所以基本上我希望我的类表现得好像它有一个集合,但实际上它没有集合。 有什么想法吗?

最佳答案

听起来您必须编写自己的迭代器。

Boost.Iterator 库有许多有用的模板。我已经使用他们的 Iterator Facade 基类好几次了,使用它定义您自己的迭代器既好又容易。

但即使没有它,迭代器也不是火箭科学。他们只需要公开正确的运算符和类型定义。在您的情况下,它们只是围绕它们在递增时必须调用的查询函数进行包装。

定义迭代器类后,只需将 begin()end() 成员函数添加到您的类即可。

听起来基本的想法是必须在迭代器递增时调用您的查询函数,以获取下一个值。 然后取消引用应该返回从上次查询调用中检索到的值。

查看标准库 stream_iterator 的一些语义可能会有所帮助,因为它们还必须解决一些可疑的问题“我们真的没有容器,我们无法创建指向当前流位置以外的任何地方的迭代器”问题。

例如,假设您需要调用一个 query() 函数,该函数在到达序列末尾时返回 NULL,创建“结束迭代器”将很棘手。但实际上,您所需要的只是定义相等性,以便“如果迭代器都将 NULL 存储为缓存值,则迭代器是相等的”。所以用 NULL 初始化“结束”迭代器。

查找输入迭代器所需的语义可能会有所帮助,或者如果您正在阅读 Boost.Iterator 的文档,专门针对单遍迭代器。您可能无法创建多遍迭代器。因此,请准确查找单遍迭代器所需的行为,并坚持这一点。

关于c++ - 通过 BOOST_FOREACH 使我的 C++ 类可迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1597695/

相关文章:

c++ - 在 C++ 中访问数组的负索引处的内存不会返回垃圾

android - 使用 Windows Azure 推送数据

java - 将迭代器转换为列表

java - 有没有更快的方法来遍历java中的BufferedImage的像素?

c++ - 面向侵入式数据结构的面向对象设计

c++ - Valgrind - 条件跳跃或移动取决于未初始化的值

c++ - 如何告诉c++编译器对象在别处没有改变以达到更好的优化

c++ - 添加到我的程序的导入功能破坏了 OOP 封装。如何恢复封装?

c# - 字符串操作模式(C# 或其他语言)

c++ - 我们可以得到一个迭代器来从 C++ 中的谓词过滤 vector 吗?