2010-10-31 18 views
6

Te podzielniki STL wymagają tego formularza konstruktora (20.1.5): X a(b); z wymogiem Y(a) == b;STL podzielnik, kopia konstruktora innego typu, ponownie powiązać

W standardowej realizacji implikuje to, i jest zaimplementowany jako:

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

Mam problem ze zrozumieniem, dlaczego to wymaganie istnieje. Rozumiem, że alokatory powinny być statyczne (nie mieć żadnego stanu), ale dlaczego na ziemi powinieneś móc je przekonwertować w ten sposób?

Odpowiedz

6

Aby umożliwić budowę z innych alokatorów, jako kontenery należy użyć innego typu alokatora niż określono. Listy i mapy, na przykład, przydzielają swój wewnętrzny typ węzła, a nie typ wartości, który eksponują.

Kod wygląda podobnie do:

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

Tylko pojemniki, które przechowują wszystkie przedmioty zwarty (wektor, String) może korzystać z danego rodzaju przydzielania bezpośrednio. –

+1

Dzięki. To naprawdę brzydki wymóg. Zaczynam się zgadzać ze Scottem Meyerem, system alokacji wydaje się być w zasadzie śmieciem. –

+0

@edA: Podobnie jak w przypadku wielu nocy spędzonych w mieście, miało to sens 15 lat temu. Zgadzam się dzisiaj. :) –

Powiązane problemy