我正在定义一个迭代器类型,它不会显式存储其当前值。相反,它是另一个迭代器的包装器,并返回底层迭代器值和另一个值的std::pair
。类定义的相关部分:
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>
,但这是一个可怕的黑客攻击,其开销超出了应有的水平。
我觉得这个“生成”迭代器不应该存在。是这样,还是有另一种方法呢?
答案 0 :(得分:2)
我建议创建一个自己的类,包含Foo *和Bar *对,如下所示:
class MyPair {
private:
FooPtrIterator foo;
Bar bar;
public:
MyPair(const FooPtrIterator& it, const Bar& b) : foo(it), bar(b) {}
Foo* first() { return *foo; }
Bar* second() { return &bar; }
};
然后在迭代器类中使用它而不是两个值。您必须在代码中更改 - &gt; first和 - &gt; second to - &gt; first()和 - &gt; second(),但这应该是可接受的更改。