2010-10-31 13 views
6

STL ayırıcılarına bu yapıcı formunu (20.1.5) gerektiren rebind: gereksinimi bu ima standart uygulamada Y(a) == b;stl ayırıcısı, diğer tip kopyası yapıcısı,

ile X a(b); ve olarak uygulanır:

template<class U> allocator(const allocator<U> & o) throw() 

Bu gereksinimin nedenini anlamakta sorun yaşıyorum. Allocatorların statik olması gerektiğini (herhangi bir devletin olmaması) anlıyorum, ama neden dünya üzerinde bunları böyle dönüştürebilmeliydiniz?

cevap

6

Kapsayıcılar, belirttiğinizden farklı bir ayırıcı türü kullanması gerektiğinden, diğer ayırıcılardan gelen yapılara izin vermek. Listeler ve haritalar, örneğin, gösterdikleri değer_türü yerine kendi iç düğüm türlerini tahsis eder. doğrudan verilen ayırıcı türünü kullanabilirsiniz bitişik tüm öğeleri saklamak

template<class T, class Alloc=std::allocator<T> > 
struct Container { 
    typedef T value_type; 
    typedef Alloc allocator_type; 

private: 
    struct Node {/*...*/}; 
    typedef typename Alloc::template rebind<Node>::other RealAllocatorType; 
    RealAllocatorType allocator; 
}; 
+1

Sadece konteynerlerin (vektör, dize):

kod benzer görünüyor. –

+1

Teşekkürler. Bu gerçekten berbat bir gereklilik. Scott Meyer ile aynı fikirde olmaya başladım, allocator sistemi temelde çöp gibi görünüyor. –

+0

@edA: Kasabada pek çok gece olduğu gibi, 15 yıl önce mantıklı. Bugün katılıyorum. :) –