У меня есть несколько контейнеров в классе, например, вектор или карта, которые содержат shared_ptr для объектов, живущих в куче.
Например,
template <typename T>
class MyExample
{
public:
private:
vector<shared_ptr<T> > vec_;
map<shared_ptr<T>, int> map_;
};
Я хочу иметь открытый интерфейс этого класса, который иногда возвращает shared_ptrs для константных объектов (через shared_ptr<const T>) и иногда shared_ptr<T>, где я позволяю вызывающей стороне изменять объекты.
Мне нужна логическая корректность const, поэтому, если я помечаю метод как const, он не может изменить объекты в куче.
Вопросы:
1) Меня смущает взаимозаменяемость shared_ptr<const T> и shared_ptr<T>. Когда кто-то передает shared_ptr<const T> в класс, я должен:
- Хранить его как
shared_ptr<T>илиshared_ptr<const T>внутри контейнера? - ИЛИ
- Могу ли я изменить карту, векторные типы (например, insert_element (
shared_ptr<const T>obj)?
2) Лучше ли создавать экземпляры классов следующим образом: MyExample<const int>? Это кажется чрезмерно ограничительным, потому что я никогда не смогу вернуть shared_ptr<int>?