Boost迭代器外观和dereference()函数

9
我试图创建一个只能引用真实值类型,而不能引用引用的迭代器。使用boost::iterator_facade是否可以实现这一点,或者需要我拥有可以通过地址\引用返回的值?
更具体地说,我的迭代器返回引用的std::pair,这意味着我的迭代器的value_type并没有存储在任何地方,而是在解引用时即时创建(就像std::map::iterator)。
1个回答

14

是的,你想要的事情是可能的。请查看boost/iterator_facade.hpp(示例适用于Boost库的版本1.49.0,但对于其新版本也适用):

  template <
    class Derived
  , class Value
  , class CategoryOrTraversal
  , class Reference   = Value&
  , class Difference  = std::ptrdiff_t
>
class iterator_facade

模板参数Reference是关键。当从boost::iterator_facade派生时,应该只指定Reference。例如,您的代码可以如下所示:

template<typename value_type>
class custom_iterator
    :    public boost::iterator_facade<
             custom_iterator<value_type>,
             value_type,
             boost::forward_traversal_tag,
             value_type
         >
{
    ...
    value_type dereference() const{ return value_type(...); }
    ...
};

谢谢你的回答,真的帮了我很多。不过我有一个问题,在指定引用模板参数之前,我只是尝试返回值。这个编译通过了,但给了我非常奇怪的结果,比如我的类中的指针在奇怪的时候变成了null。我想问的是,为什么它会编译通过呢? - FlamFace

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接