我正在设计一个C ++接口,允许用户迭代从文件解码的对象。这个解码过程有点慢。
我正在考虑使用迭代器接口,但我想避免任何不必要的副本,所以我在考虑(用户方):
begin, err := time.Parse("2006-01-02 15:04:05", "2016-12-25 "+string(start)+":00")
上一个用法示例中的 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
),但是AFAIK,读取数据的方法也会返回副本(它们提取字符)。
答案 0 :(得分:7)
听起来你正在谈论的是an input iterator。
确保从std::iterator<std::input_iterator_tag, decoded_object_type>
继承自定义迭代器类。经典实现是operator*
缓存解码对象,如果在调用operator++
之前第二次调用缓存对象,则返回缓存对象;并operator++
调用operator*
以确保对象被解码,如果它尚未解码。
答案 1 :(得分:2)
是的,没关系。 iostream基本相同:如果迭代从中获取的值,则可以复制它们,但是在流上的流或迭代器提前后,您无法保持指向它们的指针。