Долгое время я использовал std::vector
и std::shared_ptr
рука об руку. Недавно я начал использовать std::shared_ptr<const T>
всякий раз, когда нужен указатель на объект const. Все в порядке, так как std::shared_ptr<T>
можно отнести к std::shared_ptr<const T>
, а затем они используют один и тот же счетчик ссылок, и все кажется естественным.
Но когда я пытаюсь использовать конструкции, такие как std::vector< std::shared_ptr<const T> >
, я сталкиваюсь с проблемами. Для упрощения я буду обозначать две структуры:
template <class T>
using SharedPtrVector = std::vector< std::shared_ptr<T> >;
template <class T>
using SharedConstPtrVector = std::vector< std::shared_ptr<const T> >;
Проблема заключается в том, что хотя SharedPtrVector
и SharedConstPtrVector
очень похожи, SharedConstPtrVector
нельзя отнести к SharedPtrVector
.
Поэтому каждый раз, когда я хочу быть константой корректно и записываю такую функцию, как:
void f(const SharedConstPtrVector<T>& vec);
я не могу передать const SharedPtrVector<T>
в f
.
Я много думал об этом и рассматривал несколько альтернатив:
-
Запись функций преобразования
template <typename T> SharedConstPtrVector<T> toConst(const SharedPtrVector<T>&);
-
Введите код в общей форме:
template <typename T> void f(const std::vector< std::shared_ptr<T> >& vec);
или
template <typename TIterator> void f(TIterator begin, TIterator end);
-
Отбросить идею
std::vector< std::shared_ptr<const T> >
Проблема с 1. - это вычислительные накладные расходы и повышенная уродство кода, а 2. дает код "все является шаблоном".
Я неопытный программист, и я не хочу идти в неправильном направлении. Я хотел бы услышать совет от кого-то, у кого есть опыт в этой проблеме.