从作用域分配器适配器构造内部分配器

时间:2012-11-01 16:19:58

标签: c++ boost c++11

最近我开始使用C ++ 11作用域分配器概念的boost实现。现在我对如何使用带有嵌套级别多于一个的容器的scoped allocator适配器感到困惑。特别是如何将范围分配器适配器中的分配器正确地传播到嵌套的分配器,以及如何检索正确的内部分配器以便稍后传入对象?

更准确。我遇到的问题如下。拥有vector<vector<int>>,我可以做类似

的事情
namespace bco = boost::container;
typedef std::allocator<int> Alloc1;
typedef bco::vector<int, Alloc1 > Vec1;

typedef bco::scoped_allocator_adaptor<std::allocator<Vec1>, 
std::allocator<Vec1>> Alloc2;

typedef bco::vector<Vec1, Alloc2 > Vec2;

并使用

在Vec2中移动Vec1
Alloc2 alloc2;
Vec2 vec2(alloc2);
vec2.push_back(boost::move(Vec1(alloc2.inner_allocator())));

但如果我再添加一个级别并尝试相同,它将不再起作用

typedef bco::scoped_allocator_adaptor<std::allocator<Vec2>,
std::allocator<Vec2>, std::allocator<Vec2> > Alloc3;

typedef bco::vector<Vec2, Alloc3 > Vec3;

 Alloc3 alloc3;
 Vec3 vec3(alloc3);
 vec3.push_back(Vec2(alloc3.inner_allocator()));

push不会编译,因为构造Vec2的分配器不是预期的类型。这并不奇怪,因为分配器无法知道它。以下是传播分配器的有效代码。

typedef bco::scoped_allocator_adaptor< std::allocator<Vec2> > Alloc3b;
typedef bco::vector<Vec2, Alloc3b > Vec3b;

到目前为止一切顺利,但我认为无法将分配器转换为所需的类型。使用重新绑定仅更改已分配的类型,但不更改分配器类型本身。所以我错过了将范围分配器适配器转换为另一个适配器的魔力。通常一个人不关心,因为分配器特征构造函数会处理它。但是要确定,要移入的对象使用正确的分配器,我需要以某种方式从“主”范围的分配器适配器获取相应的内部分配器。谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

简短表格,更改Alloc3的typedef:

typedef bco::scoped_allocator_adaptor< std::allocator<Vec2>, 
                                       std::allocator<Vec1>, 
                                       std::allocator<int> > Alloc3;

Alloc3 alloc3;
Vec3 vec3(alloc3);
vec3.push_back(Vec2(alloc3.inner_allocator()));

没有更改它无法工作的原因是原始实现的内部分配器是bco::scoped_allocator_adaptor< std::allocator<Vec2>, std::allocator<Vec2>>。从另一个构造一个scoped_allocator_adaptor时,除第一个之外的所有模板参数必须相同。在原始情况下给你带来问题,情况并非如此,因此编译错误。