У меня есть следующий класс:Transform итератора на unordered_map с типом значения указателя на итератор на одной карте с Const ссылочного типа значения
#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;
};
Как вы можете видеть, я хочу способ Fo пользователя этого класса для перебора элементов из _children
без возможности их изменения. Вот почему я хочу создать итератор, который указывает на элементы типа pair<char, const Node&>
вместо pair<char, ptr_type>
.
Создание базового класса итератора кажется слишком сложным для задачи. Я взглянул на повышение итератора, я думаю, что transform_iterator
может быть путем, но я еще не нашел, как заставить его работать.
В то время как я нахожусь в этом, кто-нибудь знает, где я могу найти примеры различных примеров итераторов, определенных в boost-iterators
? В документе есть только один пример для каждого типа, и они не всегда соответствуют моим потребностям (я новичок в этой библиотеке, возможно, я пропустил что-то очевидное).
UPDATE: Вот моя попытка с помощью 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;
['boost :: transform_iterator'] (http://www.boost.org/doc/libs/1_53_0/libs/iterator/doc/transform_iterator.html) должен быть в состоянии сделать это. Или вы можете написать свою собственную оболочку итератора по этим строкам. –