2010-10-31 29 views
6

Các allocators STL yêu cầu mẫu đơn này constructor (20.1.5): X a(b); với yêu cầu rằng Y(a) == b;stl cấp phát, sao chép constructor loại khác, rebind

Trong việc thực hiện tiêu chuẩn này ngụ ý, và được thực hiện như:

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

Tôi không hiểu tại sao yêu cầu này tồn tại. Tôi hiểu rằng các trình phân bổ phải tĩnh (không có bất kỳ trạng thái nào), nhưng tại sao trên trái đất bạn có thể chuyển đổi chúng như thế này?

Trả lời

6

Để cho phép xây dựng từ các trình phân bổ khác, vì vùng chứa cần phải sử dụng loại phân bổ khác với loại bạn chỉ định. Ví dụ: danh sách và bản đồ phân bổ loại nút nội bộ của chúng thay vì loại giá trị mà chúng hiển thị.

Mã này trông tương tự như:

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

Chỉ container lưu trữ tất cả các mục liên tục kế nhau (vector, string) có thể sử dụng các loại cấp phát cho trực tiếp. –

+1

Cảm ơn. Đó là một yêu cầu thực sự crappy. Tôi bắt đầu đồng ý với Scott Meyer ở đây, hệ thống cấp phát dường như là rác cơ bản. –

+0

@edA: Giống như rất nhiều đêm trên thị trấn, nó có ý nghĩa cách đây 15 năm. Tôi đồng ý hôm nay. :) –

Các vấn đề liên quan