Поток C++ в unordered_map (без конструктора копирования)
Я пытаюсь найти способ получить поток из unordered_map в C++.
Тем не менее, я получаю std::thread::thread(const std::thread &), пытающийся ссылаться на удаленную функцию.
Пример:
#include "stdafx.h"
#include <unordered_map>
#include <thread>
class ThreadContainer
{
std::unordered_map<int, std::thread> map_;
public:
void addThread(int handle, std::thread thread)
{
map_.emplace(std::move(handle), std::move(thread));
}
std::thread getThread(int handle)
{
return map_.at(handle);
}
};
int main()
{
ThreadContainer testing;
return 0;
}
В этом примере кода я пытался return map_.at(handle);
а также return std::move(map_.at(handle);
ни один из них, кажется, не работает.
Как я могу получить std:: thread обратно из этого unordered_map?
1 ответ
std::thread getThread(int handle)
это функция, которая возвращает значение Это требует не удаленного конструктора копии. Как вы заметили, std::thread
Копия конструктора была удалена.
Решение: возврат по ссылке
std::thread & getThread(int handle)
и убедитесь, что приемник также является эталоном. Не форсируйте копирование в любой точке цепи.
Если с помощью "получить std::thread обратно из этого unordered_map" вы хотите удалить thread
от ThreadContainer
вы могли бы
std::thread&& removethread(int handle)
{
return std::move(map_.at(handle));
}
но это оставит "мертвую" нить в map_
, Вы, вероятно, захотите удалить ключ и теперь неприсоединенный thread
,
std::thread&& removethread(int handle)
{
std::thread temp(std::move(map_.at(handle)));
map_.erase(handle);
return std::move(temp);
}
Также обратите внимание, что ThreadContainer
не будет копируемым, потому что содержимое thread
s не может быть скопировано. Вы получите намного более читаемые сообщения об ошибках, если вы delete
ThreadContainer
Копировать конструктор и оператор присваивания.