unordered_map 中的 C++ 线程(无复制构造函数)
C++ Thread in an unordered_map (no copy constructor)
我正在尝试找出一种方法来从 c++ 中的 unordered_map 中获取线程。
但是,我得到 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);
这些似乎都不起作用。
如何从 unordered_map 中恢复 std::thread?
std::thread getThread(int handle)
是一个按值returns的函数。这需要一个 non-deleted 复制构造函数。正如您所注意到的,std::thread
的复制构造函数已被删除。
解决方案:Return参考
std::thread & getThread(int handle)
并确保接收者也是参考。不要在链中的任何点强制复制。
如果 "get the std::thread back out of this unordered_map" 你想从 ThreadContainer
中删除 thread
你可以
std::thread&& removethread(int handle)
{
return std::move(map_.at(handle));
}
但这将在 map_
中留下一个 "dead" 线程。您可能想要删除密钥和 now-unattached thread
.
std::thread&& removethread(int handle)
{
std::thread temp(std::move(map_.at(handle)));
map_.erase(handle);
return std::move(temp);
}
另请注意,ThreadContainer
将不可复制,因为包含的 thread
无法复制。如果您使用 delete
ThreadContainer
的复制构造函数和赋值运算符,您将获得更易读的错误消息。
我正在尝试找出一种方法来从 c++ 中的 unordered_map 中获取线程。
但是,我得到 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);
这些似乎都不起作用。
如何从 unordered_map 中恢复 std::thread?
std::thread getThread(int handle)
是一个按值returns的函数。这需要一个 non-deleted 复制构造函数。正如您所注意到的,std::thread
的复制构造函数已被删除。
解决方案:Return参考
std::thread & getThread(int handle)
并确保接收者也是参考。不要在链中的任何点强制复制。
如果 "get the std::thread back out of this unordered_map" 你想从 ThreadContainer
中删除 thread
你可以
std::thread&& removethread(int handle)
{
return std::move(map_.at(handle));
}
但这将在 map_
中留下一个 "dead" 线程。您可能想要删除密钥和 now-unattached thread
.
std::thread&& removethread(int handle)
{
std::thread temp(std::move(map_.at(handle)));
map_.erase(handle);
return std::move(temp);
}
另请注意,ThreadContainer
将不可复制,因为包含的 thread
无法复制。如果您使用 delete
ThreadContainer
的复制构造函数和赋值运算符,您将获得更易读的错误消息。