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