Как поместить const слабый_птр в контейнер STL

У меня есть класс TileManager который управляет временем жизни объектов и, следовательно, хранит в них shared_ptr:

class TileManager {
private:
std::vector<std::shared_ptr<const Tile>> tiles;
}

Теперь у меня есть другой класс карта который содержит не владеющие ссылками на объекты, управляемые TileManager:

class Map {
private:
std::vector<std::weak_ptr<const Tile>> tiles;
}

Моя проблема: я не хочу карта класс, чтобы иметь возможность манипулировать умными указателями на Плитка. Поэтому я хотел бы сделать указатели внутри вектор Const:

class Map {
private:
std::vector<const std::weak_ptr<const Tile>> tiles;
}

К сожалению, невозможно поместить объекты const в контейнер STL.

Кто-нибудь знает решение? Может быть, совершенно другой дизайн?

1

Решение

Элементы хранятся в vector не может быть const потому что они должны быть назначаемыми. Единственный способ, которым vector может «манипулировать» указателями любым заметным образом, будет уничтожать последние weak_ptr к данному объекту, который будет вызывать блок управления для соответствующего shared_ptr быть освобожденным (при условии, что нет другого shared_ptrЭто все еще ссылка).

Короче говоря, вы можете безопасно хранить неconst weak_ptrв векторе.

3

Другие решения

Если возможно, вы можете использовать std::set, Поскольку единственный способ получить доступ к данным из набора предоставляет только константные ссылки или константные итераторы, вы не можете напрямую манипулировать значениями.

Для этого вы бы использовали

std::set<std::weak_ptr<const Tile>, std::owner_less<std::weak_ptr<const Tile>>>,

Другое, нетехнологичное решение — сделать это по замыслу, поскольку оно является частным членом того, что, по-видимому, является вашим классом: просто скажите в своем дизайне класса «Не сбрасывайте и не перезаписывайте слабые указатели».

2

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector