最近,我开始使用C++ 11范围分配器概念的boost实现。现在,我很困惑如何将作用域分配器适配器与嵌套级别大于一个的容器一起使用。尤其是如何将范围分配器适配器中的分配器正确地传播到嵌套适配器,以及如何检索正确的内部分配器以传递给以后要移入的对象?

更准确地说。我遇到的问题如下。有了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()));

由于Vec2的构造中的分配器不是预期的类型,因此推送不会编译。这并不奇怪,因为分配器不知道。例如,以下也是传播分配器的有效代码。
typedef bco::scoped_allocator_adaptor< std::allocator<Vec2> > Alloc3b;
typedef bco::vector<Vec2, Alloc3b > Vec3b;

到目前为止,一切都很好,但是我看不到将分配器转换为所需类型的方法。使用rebind仅更改分配的类型,而不更改分配器类型本身。因此,我缺少将作用域分配器适配器转换为另一个适配器的魔力。通常不用关心,因为分配器特征构造函数会处理它。但是,要确保要移动的对象使用正确的分配器,我需要以某种方式从“主”作用域分配器适配器中获取相应的内部分配器。感谢帮助!

最佳答案

简写形式,为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时,除第一个以外的所有模板参数都必须相同。在给您带来问题的原始情况下,情况并非如此,因此出现了编译器错误。

07-24 14:31