【发布时间】:2010-07-27 10:46:58
【问题描述】:
我正在定义一个不显式存储其当前值的迭代器类型。相反,它是另一个迭代器的包装器,并返回底层迭代器值的std::pairs 和另一个值。类定义的相关部分:
class MyIterator : public std::iterator<input_iterator, std::pair<Foo *, Bar *> > {
FooPtrIterator d_iter;
Bar d_bar;
public:
MyIterator(FooPtrIterator iter, Bar const &bar)
:
d_iter(iter),
d_bar(bar)
{ }
// Returning by value, not storing the pair itself.
value_type operator*() const {
return std::make_pair(*d_iter, &d_bar);
}
// Can't return by value!
??? operator->() const {
return ???;
}
};
现在重载operator-> 时,这给我带来了麻烦,因为我希望返回一个指针,或者其他本身支持operator-> 的东西。
我可以简单地将当前的std::pair 存储为类成员:
value_type d_current;
但是,这让我在构造函数中遇到了麻烦,因为那时我不知道 FooPtrIterator iter 是否是一个有效的迭代器,所以我不能取消引用它来为 d_current 提供一个值。
我也可以让 operator-> 返回一个 boost::shared_ptr<value_type>,但这是一个可怕的 hack,开销超出了应有的水平。
我觉得这个“生成”迭代器不应该存在。是这样吗,还是有其他解决方法?
【问题讨论】:
标签: c++ iterator operator-overloading