我试图转发一些参数来进行对象的构建。我不太了解在关联容器中使用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个参数,因为对总是会为它们的构造函数接受两个参数。
答案 0 :(得分:7)
这确实是标准中的一个缺陷,它在N3178中详细讨论。
引用,
构造value_type对象的唯一方法是准确提供 Key和Value的两个参数,一对或一个 piecewise_construct_t后跟两个元组。原来的emplace() 提案允许您指定Key值后跟any Value的构造函数参数的数量。当我们删除了 variadic构造函数配对,这种能力消失了
...
如果你想构建一个对象,现状就是使用piecewise_construct_t。
答案 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修复此要求