2012-05-11 8 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

allocatorにはrebind<U>のtypedefが必要です:多くのコンテナはTを割り当てないので、同じ理由があります。

リンクリストを使用します。これらのノードには、それぞれ a Tが含まれています。そのため、は、(rebind<U>を介して)知らないタイプを割り当てることができなければなりません。しかし、それにはコピー操作が必要です。つまり、タイプrebind<U>::otherの新しいアロケータを作成する必要があります。

可能な場合は避ける方が良いです。したがって、構築と破壊のために、アロケータは、リンクされたリストの内部ノード型などの任意の型に対して適切な操作を行う必要があります。これにより、リンクリストの内部ノードタイプのフレンド機能としてAllocator::construct/destructが可能になります。

関連する問題