Существует ли законный способ преобразовать 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);
        }
    )
};
→ Ссылка