Ваша идея может сработать , если у вас не будет проблем в одном из ваших классов.Из-за недостающих частей сказать сложно.
Однако, это не тот путь !!
Карта предназначена для работы с индексом по значению.Типичный вариант использования - найти элемент с уже существующим ключом.Конечно, вы можете использовать указатели в качестве ключа, но указатель будет действовать как своего рода идентификатор без каких-либо полиморфных операций.
С другой стороны, unique_ptr
предназначен для обеспечения уникального владения.Таким образом, существует только одна уникальная копия каждого значения указателя.Это делает его очень трудным для использования в качестве значения карты:
auto team2 = make_unique<Team>();
teams [team2] = make_unique<vector<unique_ptr<Employee>>>(); // doesn't compile
Приведенный выше код не компилируется, поскольку team2
является unique_ptr
и не может быть скопирован в параметр индексации.Использование его для поиска или вставки элемента потребует его перемещения:
teams [std::move(team2)] = make_unique<vector<unique_ptr<Employee>>>(); //compiles
assert (team2); // ouch
Но после перемещения значение unique_ptr
больше не находится в team2
, которое теперь пусто, так как уникальный указатель находится включ карты и он уникален. Это означает, что вы никогда не найдете обратно добавленную команду .
Лучшие альтернативы?
Если вы действительно хотите использовать полиморфный указатель в качестве ключа карты, вы должны хотя бы использовать shared_ptr
, чтобы несколько копийможет существовать в вашем коде.Но я бы посоветовал использовать значения только в качестве ключа
Теперь к части значения карты.Нет смысла делать unique_ptr
из vector
: сам вектор не является полиморфным, а векторы хорошо разработаны для копирования, перемещения и так далее.Кроме того, sizeof(vector<...>)
мало даже для очень больших векторов.
Используйте vector<unique_ptr<Employee>>
, если вы хотите, чтобы вектор на карте был владеть Employees
, или vector<shared_ptr<Employee>>
, если вы хотите поделиться содержимым вектора.