Итак.
struct my_tuple_hasher
{
std::size_t operator()(const std::pair<std::string, std::string>& k) const
{
std::string s1, s2, s3;
std::tie(s1, s2, s3) = k;
return std::hash<std::string>()(s1) ^ std::hash<std::string>()(s2) ^ std::hash<std::string>()(s3);
}
};
std::unordered_map<std::tuple<std::string, std::string, std::string>, std::unique_ptr<SOMETHING>, my_tuple_hasher> m;
Тут у нас unordered_map с tuple из 3 строк в качестве ключа и с умным указателем unique_ptr в качестве значения.
Хеш для unordered_map я реализовал, см выше.
Заполняем:
auto ob02 = std::unique_ptr<SOME_TYPE>(new SOME_TYPE());
ob02->... = ...;
m[std::make_tuple("Lorem", "ipsum", "1")] = std::move(ob02);
Без проблем.
А теперь у нас есть еще один unordered_map по имени m2, точно того же типа, но пока пустой.
И нужно все элементы перекинуть в него. (Это НЕ копирование, это потом будет объединение нескольких мапов в 1):
for (auto it = m.begin(); it != m.end(); ++it)
{
m2[it->first] = std::move(it->second);
}
И вот тут проблема. Ругается! Еще бы, ведь first вместо
tuple<string, string, string>
возвращает какой-то
tr1::tuple<...>
И я вынужден, как идиот, распаковывать it->first через tie, делать из значений новый тупл и класть его в новую мапу - и так каждый тупл.
Например, с std::pair такой проблемы нет.
Что делать? Вложенный std::pair и т.п. не предлагать, только туплы.