История начинается с того, что я думал довольно просто:
Мне нужно создать класс, который будет использовать некоторые STL-контейнеры. Мне нужно предоставить пользователям доступ класса к неизменяемой версии этих контейнеров. Я не хочу, чтобы пользователи могли изменять контейнер (они не могут push_back()
в списке, например), но я хочу, чтобы пользователи могли изменять содержащиеся объекты (получить элемент с back()
и изменить его)
class Foo
{
public:
// [...]
ImmutableListWithMutableElementsType getImmutableListWithMutableElements();
// [...]
};
// [...]
myList = foo.getImmutableListWithMutableElements();
myElement = myList.back();
myElement.change(42); // OK
// [...]
// myList.push_back(myOtherElement); // Not possible
На первый взгляд кажется, что контейнер const будет работать. Но, конечно, вы можете использовать только константный итератор в контейнере const, и вы не можете изменить его.
На первый взгляд, такие вещи, как специализированный контейнер или итератор, приходят на ум. Я, вероятно, в конечном итоге с этим.
Тогда моя мысль: "Кто-то, должно быть, уже это сделал!" или "Элегантное, общее решение должно существовать!" и я здесь задаю свой первый вопрос о SO:
Как вы проектируете/трансформируете стандартный контейнер в неизменяемый контейнер с изменяемым контентом?
Я работаю над этим, но чувствую, что кто-то просто скажет: "Эй, я делаю это каждый раз, это легко, смотри!", поэтому я спрашиваю...
Спасибо за любые подсказки, предложения или замечательные общие способы сделать это:)
EDIT:
После некоторых экспериментов я столкнулся со стандартными контейнерами, которые обрабатывают некоторые специально украшенные интеллектуальные указатели. Это близко к ответу Николая.
Идея непреложного контейнера изменчивых элементов не является концепцией убийства, см. интересные заметки в ответе Оли.
Идея конкретного итератора, конечно, конечно, но это кажется непрактичным, поскольку мне нужно адаптироваться к любому контейнеру.
Спасибо вам всем за вашу помощь.