我有以下课程:
#include <unordered_map>
#include <memory>
class Node {
public:
typedef std::unique_ptr<Node> ptr_type;
typedef std::unordered_map<char, ptr_type> map_type;
typedef /**???**/ const_iterator;
const_iterator begin() const;
const_iterator end() const;
private:
map_type _children;
};
如您所见,我希望此类用户_children
能够在无法修改它们的情况下迭代元素。这就是为什么我想创建一个指向 type 元素pair<char, const Node&>
而不是pair<char, ptr_type>
.
对于手头的任务来说,创建一个基迭代器类似乎有点太复杂了。我看过 boost iterator,我认为transform_iterator
可能是要走的路,但我还没有找到如何让它工作。
当我在这里时,有谁知道我在哪里可以找到定义的迭代器的不同示例的示例boost-iterators
?每种类型的文档中只有一个示例,它们并不总是符合我的需求(我是这个库的新手,我可能错过了一些明显的东西)。
更新:这是我尝试使用boost::transform_iterator
class Node {
public:
typedef std::unique_ptr<Node> ptr_type;
typedef std::unordered_map<char, ptr_type> map_type;
struct Transformer {
std::pair<char, const Node&> operator()(const std::pair<char, ptr_type> &p) const {
return std::pair<char, const Node&>(p.first, *p.second);
}
};
typedef boost::transform_iterator<Transformer, map_type::const_iterator, std::pair<char, const Node&>&, std::pair<char, const Node&>> const_iterator;
const_iterator begin() const {
return boost::make_transform_iterator<Transformer, map_type::const_iterator>(_children.begin(), Transformer());
}
const_iterator end() const {
return boost::make_transform_iterator<Transformer, map_type::const_iterator>(_children.end(), Transformer());
}
private:
map_type _children;
};
不幸的是,它没有编译,并给出以下错误:
error: no type named ‘type’ in ‘boost::mpl::eval_if<boost::is_same<boost::iterators::use_default, boost::iterators::use_default>, boost::result_of<const Node::Transformer(const std::pair<const char, std::unique_ptr<Node> >&)>, boost::mpl::identity<boost::iterators::use_default> >::f_ {aka struct boost::result_of<const Node::Transformer(const std::pair<const char, std::unique_ptr<Node> >&)>}’
typedef typename f_::type type;