У меня есть контейнер boost::bimap<int, boost::shared_ptr<A>>
, и я хочу вернуть итератор в левое представление, обеспечивая постоянство содержимого. Возврат container.left.begin()
возвращает итератор, разыменованный на std::pair<int const, boost::shared_ptr<A> const>
.
Очевидно, это не то, что я хочу, поскольку можно изменить A
, разыменовав shared_ptr
. Мне нужен итератор, который разыменовывается на std::pair<int const, boost::shared_ptr<A const>>
(мне все равно, является ли shared_ptr константой или нет). Я знаю, что мне, вероятно, следует сделать это с помощью boost :: transform_iterator, но я не могу понять, как должна выглядеть функция "приведения".
Кто-нибудь может мне с этим помочь? Или есть другой, более простой способ получить то, что я хочу?
Редактировать: Вот что у меня есть, достаточно сказать, это дает мне два хороших экрана с ошибками.
typedef boost::bimap<unsigned int, boost::shared_ptr<A> > container_type;
typedef container_type::left_const_iterator base_const_iterator;
typedef boost::transform_iterator<makeIterConst<A>, base_const_iterator> const_iterator;
template <typename T>
struct makeIterConst : std::unary_function<std::pair<unsigned int const, boost::shared_ptr<T> const>, std::pair<unsigned int const, boost::shared_ptr<T const> const> >
{
std::pair<unsigned int const, boost::shared_ptr<T const> const> operator() (std::pair<int const, boost::shared_ptr<T> const> const & orig) const
{
std::pair<int const, boost::shared_ptr<T const> const> newPair(orig.first, boost::const_pointer_cast<T const>(orig.second));
return newPair;
}
};
Вот "основная" ошибка:
примечание: функция-кандидат нежизнеспособна: неизвестное преобразование из 'const boost :: bimaps :: Relations :: structured_pair, boost :: bimaps :: tags :: tagged, boost :: bimaps :: Relations :: member_at :: right>, mpl _ :: na, boost :: bimaps :: Relations :: normal_layout> 'to' const std :: pair> 'для 1-го аргумента