我有一個包含 a 的類,std::mutex因此它不可移動或復制。
struct MyObject {
MyObject(std::string s_) : s(s_) {};
std::mutex lock;
std::thread worker;
std::string s;
};
我可以輕松地將此物件添加到此地圖:
std::map<int, MyObject> my_map;
my_map.emplace(std::piecewise_construct,
std::forward_as_tuple(5),
std::forward_as_tuple("string0"));
但我想用 astd::array來保存其中的幾個:
std::map<int, std::array<MyObject, 3>> my_map;
如果MyObject是可移動的,那么我可以這樣做:
my_map.emplace(4, {MyObject("string0"), MyObject("string1"), MyObject("string2")});
但這在MyObject不可移動時不起作用(如預期)。我不能回到分段構造,因為 std::array 不能從 3 個字串的元組構造。
my_map.emplace(std::piecewise_construct,
std::forward_as_tuple(4),
std::forward_as_tuple("string0", "string1", "string2"));
有沒有辦法std::array在地圖中構建一個不可移動的物件?
我正在使用這些問題作為參考。有沒有辦法合并答案?
emplace 和 unordered_map<?, std::array<?, N>>
如何將不可復制和不可移動的物件分配到 std::map 中?
我也試過:
std::array<MyObject, 3> list = {
MyObject("string0"),
MyObject("string1"),
MyObject("string2")
};
my_map.emplace(4, std::move(list));
考慮到串列應該是可移動的,但這也不起作用。
uj5u.com熱心網友回復:
使用自定義陣列,您可能會這樣做
template <typename T, std::size_t N>
struct MyArray
{
template <typename... Us>
MyArray(Us&&... args) : arr{ std::forward<Us>(args)...} {}
std::array<T, N> arr;
};
void foo()
{
std::map<int, MyArray<MyObject, 3>> my_map;
my_map.emplace(std::piecewise_construct,
std::forward_as_tuple(4),
std::forward_as_tuple(std::string("string0"),
std::string("string1"),
std::string("string2")));
}
演示
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/376887.html
