Существует ли законный способ преобразовать const_iterator в iterator?
Подскажите, пожалуйста, возможно ли законно преобразовать const_iterator в iterator?
Проблема следующая:
Я пишу индексатор, в публичном интерфейсе которого фигурирует хэндл, который имеет тип std::list<...>::const_iterator. Это сделано для того, чтобы внешний код мог самостоятельно использовать данный итератор для вызова константных методов (геттеров) того, на что указывает итератор данного типа.
Например:
class Object
{
// ...
public:
size_t GetField() const
{
return field;
}
private:
size_t key;
size_t field;
};
class Indexator
{
public:
using Handle = std::list<Object>::const_iterator;
Handle GetObjectByKey(const size_t key) const
{
// ...
}
};
Но я также хочу, чтобы внешний код смог поменять неиндексируемые поля, пускай и через использование методов Indexer.
Например так:
void Indexator::SetField(Handle handle)
{
std::list<Object>::iterator iterator = (cast?) handle;
iterator->field = ...;
}
Существует ли законный способ преобразовать const_iterator в iterator?
Ответы (1 шт):
Автор решения: user7860670
→ Ссылка
Вот пример законного (но неэффективного) способа:
::std::list<Object> items{};
...
::std::list<Object>::iterator p_non_const
{
::std::find_if
(
items.begin()
, items.end()
, [handle](Object const & object) noexcept -> bool
{
return ::std::addressof(object) == ::std::addressof(*handle);
}
)
};