3

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

更准确地说。我遇到的问题如下。有一个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 只会更改分配的类型,但不会更改分配器类型本身。所以我错过了将作用域分配器适配器转换为另一个的魔法。通常人们并不关心,因为分配器特征构造函数会处理它。但是,可以肯定的是,要移入的对象使用正确的分配器,我需要以某种方式从“主”作用域分配器适配器获取相应的内部分配器。感谢帮助!

4

1 回答 1

1

Short form, change your typedef for Alloc3:

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()));

The reason it didn't work without the change is that the inner allocator for your original implementation was bco::scoped_allocator_adaptor< std::allocator<Vec2>, std::allocator<Vec2>>. When constructing one scoped_allocator_adaptor from another, all of the template arguments except the first have to be the same. In the original case giving you problems, this was not the case, hence the compiler error.

于 2012-11-01T18:29:37.593 回答