Поток 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 не будет копируемым, потому что содержимое threads не может быть скопировано. Вы получите намного более читаемые сообщения об ошибках, если вы deleteThreadContainerКопировать конструктор и оператор присваивания.

Другие вопросы по тегам