У меня есть несколько контейнеров в классе, например, вектор или карта, которые содержат 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>
?