标准似乎有点broken,所以据我所知,只留下了这种“正确”的方式,用{{1}的非一元构造函数来安置地图}(from cppreference):
Type
由于这很丑陋,我想知道是否有一种标准的,好的方式来放置不需要调用std::map<std::string, std::string> m;
// uses pair's piecewise constructor (overload 6)
m.emplace(std::piecewise_construct,
std::forward_as_tuple("c"),
std::forward_as_tuple(10, 'c'));
的复制构造函数的地图元素。目前我这样做:
Type
但这并不特别感觉 emplacy 。还有更好的方法吗?
答案 0 :(得分:1)
emplace
中的std::map<K,T>
参数会转发给std::pair<const K, V>
构造函数。这意味着您只能使用ones。
正如您将看到的,您无法改进语法,唯一的可变参数构造是您在第一个代码段中使用的构造。所有其他内容都需要已完成K
和V
。
答案 1 :(得分:0)
m.emplace("c",std::string(10, 'c'));
有什么问题? std::map
需要存储std::pair
来保存密钥和值。调用m.emplace(A,B)
看起来非常合理,可以指定键(1.参数)和值(2.参数)。
当构造键和/或值不仅需要一个而是多个参数时,它变得棘手。然后你必须使用你的问题中提到的分段构造函数。通常不可能使用可变参数模板函数来构造两个对象。