我正在尝试实现 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/