在关联容器中使用emplace(args&& ...)

时间:2012-12-03 18:33:35

标签: c++ c++11 variadic-templates stdmap std-pair

我试图转发一些参数来进行对象的构建。我不太了解在关联容器中使用emplace的原理,或者我可能只是以错误的方式使用/思考。如果有人可以共享代码片段以供使用,那就太好了。

像map这样的关联容器总是存储一个kind对的对象,而emplace函数表示它将通过转发参数来调用所存储对象的构造函数(对于map的情况总是成对)。那么即使函数具有可变参数签名,我们是否仅限于提供两个参数(键,值)?

当我使用增强容器的emplace之前,我可以传递如下参数: emplace(arg1,arg2,arg3,arg4)//其中arg2,arg3,arg4用于构造对象,arg 1是关键。

在使用新的gcc-4.6和c ++ 11进行编译时,这会中断 但现在我必须做一些事情: emplace(arg1,myobj(arg2,arg3,arg4)); //使相同的代码工作;

所以新的安卓不会像升级那样做任何明智的建设吗?我只限制为地图提供2个参数,因为对总是会为它们的构造函数接受两个参数。

2 个答案:

答案 0 :(得分:7)

这确实是标准中的一个缺陷,它在N3178中详细讨论。

引用,

  

构造value_type对象的唯一方法是准确提供   Key和Value的两个参数,一对或一个   piecewise_construct_t后跟两个元组。原来的emplace()   提案允许您指定Key值后跟any   Value的构造函数参数的数量。当我们删除了   variadic构造函数配对,这种能力消失了

...

  

如果你想构建一个对象,现状就是使用piecewise_construct_t。

closed as "NAD"

答案 1 :(得分:7)

  

所以新的emplace不会像boost一样做任何明智的构造吗?

你所谓的“分段建筑”并不是标准所指的分段建筑,即:

m.emplace(std::piecewise_construct,
          std::forward_as_tuple<A1>(arg1),
          std::forward_as_tuple<A2,A3,A4>(arg2, arg3, arg4));

这完全符合您的要求,将args的元组转发给第一个和第二个pair成员(但请注意,对于GCC 4.6,这需要每个参数类型都有一个可访问的复制构造函数,请参阅{{3} } - 通过使用委托构造函数(GCC 4.6不支持)对GCC 4.7修复此要求