2012-05-11 2 views
8

std::allocatorconstructdestroy 멤버 함수는 요소의 유형에 매개 변수를 구성 할 수 있습니다왜 std :: allocator :: construct와 std :: allocator :: destroy는 요소 유형에 템플릿을 사용합니까?

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

    ... 
}; 

이에 대한 근거 무엇입니까? 왜 그들은 value_type* 또는 pointer 중 하나를 선택하지 않습니까? allocator<T>T 유형의 개체를 구성하거나 파괴하는 방법 만 알고 있어야합니다.

답변

16

많은 컨테이너가 T을 할당하지 않기 때문에 allocator에는 rebind<U> typedef가 있어야하는 것과 같은 이유 때문입니다.

링크 된 목록을 사용하십시오. 이 노드는 각각 , T을 구성원으로 포함하는 노드를 할당합니다. 그러므로 allocator은 (rebind<U>을 통해) 알지 못하는 유형을 할당 할 수 있어야합니다. 그러나 복사 작업이 필요합니다. rebind<U>::other 유형의 새 할당자를 만들어야합니다.

가능하면 피하는 것이 좋습니다. 따라서 구성 및 소멸을 위해 할당자는 연결된 목록의 내부 노드 유형과 같은 모든 유형의 적절한 작업을 수행해야합니다. 이렇게하면 연결된 목록의 내부 노드 유형이 친구 기능으로 Allocator::construct/destruct이 될 수도 있습니다.