2012-11-01 50 views
3

最近我開始使用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; 

,並使用

Alloc2 alloc2; 
Vec2 vec2(alloc2); 
vec2.push_back(boost::move(Vec1(alloc2.inner_allocator()))); 

在VEC 2移動VEC 1但是,如果我增加一個級別,並嘗試一樣,它不會再工作下去

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只會改變分配的類型,而不會改變分配器類型本身。所以我錯過了將範圍分配器適配器轉換爲另一個適配器的魔法。通常情況下,人們不關心分配器特性構造函數將會處理它。可以肯定的是,要移入的對象使用正確的分配器,我需要從「主」作用域分配器適配器以某種方式獲得相應的內部分配器。感謝幫助!

回答

1

縮寫形式,改變你的typedef 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())); 

它並沒有改變工作的原因是,你原來實行的內部分配是bco::scoped_allocator_adaptor< std::allocator<Vec2>, std::allocator<Vec2>>。當從另一個構建一個scoped_allocator_adaptor時,除第一個之外的所有模板參數必須相同。在原來的情況下給你的問題,情況並非如此,因此編譯器錯誤。

+0

嗨,感謝您的回覆。它的工作原理。然而,爲了實現它,我必須知道Vec1的實現細節。特別是我必須將每個分配器定義到所需的嵌套級別,並且不能使用Alloc3b中使用的定義。這個問題似乎將一個類型爲'Vec3 :: allocator_type :: inner_allocator_type'的分配器轉換爲一個 'Vec3 :: value_type :: allocator_type'。這種魔力必須由allocator_traits構造函數完成,但我無法弄清楚它是如何實現的。 – mmathes

+1

@mmathes:那麼,'魔術'就是scoped_allocator_adaptor具有OuterAllocator(它的類型列表中的第一個分配器)作爲基類。這允許將它傳遞給期望執行切片的OuterAllocator的容器。 –