unordered_map emplace с конструктором по умолчанию - PullRequest
0 голосов
/ 20 марта 2020

У меня есть unordered_map с парами ключ-значение типа string и aClass соответственно; где aClass не может быть перемещен (у него есть мьютекс). Я не хочу, чтобы это тоже было сконструировано копией; Я думаю, что было бы неразумно копировать-конструировать класс, содержащий мьютекс. Чтобы отложить создание элемента до его вставки на карту, я попытался вставить его на карту, используя emplace, поэтому второй аргумент должен быть пустым:

aList.emplace("aString");

однако предыдущая строка сделала не работа. Есть идеи, как использовать конструктор по умолчанию? Я также попробовал:

aList.emplace("aString", void);
aList.emplace("aString", {});
aList.emplace(std::piecewise_construct,"aString");

Спасибо,

Ответы [ 2 ]

2 голосов
/ 20 марта 2020

Если у вас есть доступ к C ++ 17, вы можете использовать try_emplace:

myMap.try_emplace("someKey");

Это создаст по умолчанию новый элемент с ключом "someKey".

До C ++ 17 вы можете использовать emplace, используя std::pair конструктор std::piecewise_construct и пустой кортеж для аргументов значения:

myMap.emplace(std::piecewise_construct,
              std::forward_as_tuple("someKey"),
              std::tuple<>{});
2 голосов
/ 20 марта 2020

Одним из решений является использование std::unordered_map<>::operator[], которое создает новые элементы с использованием конструктора по умолчанию:

auto& element = m["aString"]; // Creates a new element or gets an existing one.

Или, если возвращаемое значение не требуется:

static_cast<void>(m["aString"]);
...