2012-05-11 11 views
8

std::allocator bireyin construct ve destroy üye fonksiyonları öğenin türüne parametreli inşa etmek şunlardır:Neden std :: allocator :: yapı ve std :: allocator :: eleman türünde şablon oluşturuluyor?

template<class T> 
    class allocator 
{ 
    public: 
    typedef T value_type; 
    typedef T* pointer; 

    template<class U, class... Args> 
     void construct(U *p, Args&&... args); 

    template<class U> 
     void destroy(U *p); 

    ... 
}; 

Buna gerekçe nedir? Neden value_type* veya pointer mu almıyorlar? allocator<T> yalnızca T türünde nesnelerin nasıl oluşturulacağını veya yok edileceğini bilmelidir.

cevap

16

allocator s aynı nedenden dolayı rebind<U> typedef'e sahip olmak zorundadır: çünkü birçok kapsayıcı hiçbir zaman T s'yi ayırmaz.

Bağlantılı listeleri alın. Bu tahsis düğümleri, her biri , bir T içerir. Yani allocator s bilmedikleri bir tür (rebind<U> aracılığıyla) tahsis edebilmek için gereklidir. Ancak, bu bir kopyalama işlemi gerektirir: rebind<U>::other türünde yeni bir ayırıcı oluşturulmasını gerektirir.

Mümkün olduğunda bunu önlemek daha iyidir. Bu nedenle, inşaat ve yıkım için, ayırıcılar, bağlantılı listenin iç düğüm türleri gibi herhangi bir türdeki uygun işlemleri yapmak zorundadırlar. Bu ayrıca bağlantılı listenin iç düğüm türünün arkadaş işlevleri olarak Allocator::construct/destruct olmasını sağlar.

İlgili konular