c++ - 映射<T,shared_ptr<U>>的间接迭代器

标签 c++ boost c++11 iterator boost-iterators

我正在尝试实现 map<T, shared_ptr<U>> 的迭代器“删除”shared_ptr ,即取消引用 pair<T, U&> 。我需要这个来调整我的包装器 map基于范围的 for 循环。

boost::indirect_iterator似乎是为这种需要而设计的。我试过这个:

typedef std::map<int, std::shared_ptr<int>> M;
typedef boost::indirect_iterator<M::iterator, std::pair<int, int>> It;

这不起作用,因为 indirect_iterator要求:

表达式 *v(其中 v 是 iterator_traits::value_type 的对象)应为有效表达式并可转换为引用。

是否可以使用boost::indirect_iterator为了这个任务?如果没有,我可以用 boost::iterator_adaptor 来做到这一点吗? ?

最佳答案

感谢@Xeo评论,解决方案是使用Boost.Range。我从 VC10 得到的东西

#include <boost/range/adaptor/map.hpp>
#include <boost/range/adaptor/indirected.hpp>

#if defined(_MSC_VER) && _MSC_VER <= 1600 // VC10
    template< class T >
    typename std::add_rvalue_reference<T>::type declval();
#endif

class Wrapper
{
private:
    typedef std::map<T, std::shared_ptr<U>> Container;

public:
    typedef decltype(declval<Container&>() | boost::adaptors::map_values | boost::adaptors::indirected) IteratorRange;
    typedef decltype(declval<Container&>() | boost::adaptors::map_values | boost::adaptors::indirected) ConstIteratorRange;
    typedef IteratorRange::iterator Iterator;
    typedef ConstIteratorRange::const_iterator ConstIterator;

    Iterator begin()
    {
        return iteratorRange().begin();
    }

    // by analogy
    ConstIterator begin() const;
    ConstIterator cbegin() const;
    Iterator end();
    ConstIterator end() const;
    ConstIterator cend() const;

private:
    IteratorRange iteratorRange()
    {
        return container | boost::adaptors::map_values | boost::adaptors::indirected;
    }

    ConstIteratorRange iteratorRange() const;

private:
    Container container;
};

关于c++ - 映射<T,shared_ptr<U>>的间接迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15577231/

相关文章:

c++ - 从基类解析 C++ 虚函数

c++ - 如何使用 VS 2019 Preview 在 Windows 10 中安装 boost

c++ - 为什么 std::async 比简单的分离线程慢?

c++11 - 为什么我得到 "warning: missing initializer for member"? [-Wmissing-field-initializers]

c++ - 我可以将从相机获取的单 channel 图像输出到 winAppi 窗口吗?

c++ - 将 PNG 纹理导入内存而不是帧缓冲区 - 使用 C++ 和 OpenGL

c++ - 包含 C++ 标准库

c++ - 具有自定义顶点属性的图的 boost 支配树

c++ - 使用带有 Incrementable 类型的 boostcounting_iterator

C++ std::move 混淆