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

use*_*156 4 c++ stdmap variadic-templates c++11 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个参数,因为对将始终为其构造函数接受两个参数.

Cub*_*bbi 7

这确实是标准中的缺陷,在N3178中详细讨论.

报价,

构造value_type对象的唯一方法是为Key和Value,一对或一个piecewise_construct_t提供两个参数,后跟两个元组.原始的emplace()提议允许您指定一个Key值,后跟Value的任意数量的构造函数参数.当我们删除可变参数构造函数来配对时,这种能力消失了

...

如果你想构造一个对象,现状是使用piecewise_construct_t.

它被关闭为"NAD"


Jon*_*ely 7

所以新的安卓不会像升级那样做任何明智的结构吗?

你所说的"分段建筑"并不是标准所指的分段建筑,它是:

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

这完全符合您的要求,将args的元组转发给第一个和第二个pair成员(但请注意,对于GCC 4.6,这需要为每个参数类型提供可访问的复制构造函数,请参阅http://gcc.gnu.org/bugzilla/ show_bug.cgi?id = 51183 - 通过使用委托构造函数对GCC 4.7修复此要求,GCC 4.6不支持)