4

我正在设计一个 C++ 接口,它允许用户迭代从文件解码的对象。这个解码过程有点慢。

我正在为此考虑一个迭代器接口,但我想避免任何不必要的复制,所以我正在考虑(用户方面):

for (const auto& object : file) {
    // you can access the members of `object` here
    std::cout << object.whatever() << std::endl;

    // you can copy `object` here
    myObjectCopy = object;

    // you CANNOT do this because `object` changes
    // as soon as the iterator advances
    myObjectPtr = &object;
}

object在前面的用法示例中是对迭代器实例内部对象的引用。

这是错的吗?您会在这里建议哪些其他惯用接口?

我想到了一个流接口(想想std::istream),但是 AFAIK,读取数据的方法也返回副本(它们提取字符)。

4

2 回答 2

7

听起来你在说的是一个输入迭代器

请务必从std::iterator<std::input_iterator_tag, decoded_object_type>. 一个经典的实现是operator*缓存解码后的对象,如果在被调用之前operator++被第二次调用,则返回缓存的对象;并operator++调用operator*以确保对象已解码(如果尚未解码)。

于 2016-11-04T15:19:49.890 回答
2

好的,可以。iostream 基本上是相同的:如果您遍历从中获得的值,则可以复制它们,但在流或流上的迭代器高级后,您不能持有指向它们的指针。

于 2016-11-04T15:17:57.707 回答