Правильность константы интеллектуального указателя C++

У меня есть несколько контейнеров в классе, например, векторе или карте, которые содержат 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> где я позволяю вызывающей стороне видоизменять объекты.

Я хочу логическую правильность константы, поэтому если я отмечаю метод как константу, она не может изменить объекты на "куче".

Вопросы:

1) Я смущен взаимозаменяемостью shared_ptr<const T> и shared_ptr<T>. Когда кто-то передает a shared_ptr<const T> в класс сделайте меня:

  • Сохраните его как a shared_ptr<T> или shared_ptr<const T> в контейнере?
  • ИЛИ
  • Сделайте я изменяю карту, типы векторов (например, insert_element (shared_ptr<const T> obj)?

2) Лучше инстанцировать классов следующим образом: MyExample<const int>? Это кажется незаконно строгим, потому что я никогда не могу возвращать a shared_ptr<int>?

42
задан Daniel Trugman 7 August 2019 в 14:09
поделиться