?-6ren"> ?-我正在定义一个不显式存储其当前值的迭代器类型。相反,它是另一个迭代器的包装器,并返回 std::pair底层迭代器的值和另一个值的 s。类定义的相关部分: class MyIterator : pub-6ren">
gpt4 book ai didi

c++ - 如何在 "generating"迭代器上重载 operator->?

转载 作者:太空狗 更新时间:2023-10-29 22:52:58 26 4
gpt4 key购买 nike

我正在定义一个不显式存储其当前值的迭代器类型。相反,它是另一个迭代器的包装器,并返回 std::pair底层迭代器的值和另一个值的 s。类定义的相关部分:

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作为类(class)成员:

    value_type d_current;

但是,这让我在构造函数中遇到了麻烦,因为那时我无法知道 FooPtrIterator iter 是否存在。是一个有效的迭代器,所以我不能取消引用它来提供 d_current有一个值。

我也可以制作operator->返回 boost::shared_ptr<value_type>但这是一个可怕的黑客攻击,其开销超出了应有的需要。

我感觉这个“正在生成”的迭代器不应该存在。是这样吗,还是有其他解决方法?

最佳答案

我建议创建一个包含 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; }
};

然后只需在迭代器类中使用它而不是这两个值。您必须在代码中将 ->first 和 ->second 更改为 ->first() 和 ->second() 但这应该是可以接受的更改。

关于c++ - 如何在 "generating"迭代器上重载 operator->?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3342801/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com