c++ - 如何将具有无参数构造函数的对象放置到 std::map 中?

标签 c++ c++11

我想将一个对象放置到一个 std::map 中,它的构造函数不接受任何参数。但是,std::map::emplace 似乎除了键之外至少需要一个额外的参数。那么如何将零参数转发给构造函数呢?

最佳答案

std::map<K, V> 的元素类型实际上是std::pair<K, V> ,所以当你进入 map 时,参数将被转发给 std::pair 的构造函数.这就是为什么你不能只传递 key :std::pair<K, V>不能由单个参数构造(除非它是另一对相同类型的参数。)您可以传递零个参数,但是键将被值初始化,这可能不是您想要的。

在大多数情况下,移动值会很便宜(并且键会很小且可复制),您真的应该这样做:

M.emplace(k, V{});

在哪里 V是映射类型。它将被值初始化并移动到容器中。 (这个 Action 甚至可能被忽略;我不确定。)

如果你不能动,你真的需要V要就地构造,必须使用分段构造构造函数...

M.emplace(std::piecewise_construct, std::make_tuple(k), std::make_tuple());

这会导致 std::pair使用 k 构造第一个元素第二个元素使用零参数(值初始化)。

关于c++ - 如何将具有无参数构造函数的对象放置到 std::map 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27553776/

相关文章:

c++ - 使用 Dijkstra 算法在邻接矩阵中查找最短路径

c++ - 从流中不可破坏地读取

c++ - 在 C++ 中替代 bash 同步

c++ - std::vector 应该尊重 alignof(value_type) 吗?

c++ - 当通过 const 引用传递的对象被添加到像 std::map 这样的容器时会发生什么?

c++ - 'int' 之前的预期主表达式

c++ - 使用原子指令实现 C++ 锁?

c++ - 在 for-each 循环中使用 'const' 时是否需要添加 'auto'?

c++ - 如何通过 FTP 'touch' 远程文件?

c++ - 根据 c-tor 的特定条件选择要初始化的变量?