2011-01-27 8 views
5

Có, trong thư viện chuẩn hoặc Boost, một số loại lớp cơ sở tiện ích để điền một chuỗi tương thích STL tùy chỉnh với typedefs được yêu cầu (size_type, value_type, v.v ...). Tôi đang nghĩ về một cái gì đó như boost::iterator_facade, nhưng đối với các thùng chứa.Boilerplate typedefs cho container tương thích STL

Tôi sẽ tự mình triển khai, nhưng muốn đảm bảo rằng một thứ như vậy không tồn tại.

UPDATE:

Đây là lớp cơ sở tiện ích tôi đã đưa ra, trong trường hợp bất cứ ai tìm thấy nó hữu ích:

template <class C> 
class ContainerAdapter 
{ 
public: 
    typedef C::value_type value_type; 
    typedef C::reference reference; 
    typedef C::const_reference const_reference; 
    typedef C::const_iterator iterator; 
    typedef C::const_iterator const_iterator; 
    typedef C::difference_type difference_type; 
    typedef C::size_type size_type; 

protected: 
    typedef C::container_type; 
}; 


// Usage 
class MyCustomContainer : public ContainerAdapter< std::vector<int> > 
{ 
... 
}; 

ContainerAdapter đơn giản là "tiếng vang" các typedefs lồng nhau của container nằm bên dưới một container tùy chỉnh của. Không có gì để nó, thực sự.

+0

Mọi người sử dụng value_type và iterator vì nó dễ dàng hơn các lựa chọn thay thế, nhưng tôi thường sử dụng value_type & thay vì tham chiếu, ví dụ (và vector là ác). Bạn có chắc chắn cung cấp những typedefs lồng nhau khác có lợi cho bạn không? Thông thường tôi chuyển các mục vào các chức năng mà chúng sẽ bị ràng buộc như một const & anyway, và rằng const_reference typedef không bao giờ được chạm vào. –

+0

@Fred: Tôi chỉ lo lắng về vùng chứa của mình tương thích với những thứ như BOOST_FOREACH, tăng phạm vi, std :: back_insertion_iterator, v.v. Nếu tôi chỉ cần cung cấp một tập con tối thiểu của tất cả các typedef, tôi muốn biết đó. Tôi cho rằng thật dễ dàng để thử nghiệm và tìm hiểu. –

+0

Đúng, nhưng các tiện ích chung thường được viết là thuyết bất khả tri; 0x tự động là tuyệt vời cho điều đó. :) –

Trả lời

1

ngay cả khi nó tồn tại, bạn vẫn phải typedef typename base::size_type size_type. dường như bạn sẽ không đạt được nhiều.

+0

Bạn chỉ cần nhập lại typedef trong lớp dẫn xuất nếu bạn muốn typedef được hiển thị trong khai báo lớp. Người dùng của vùng chứa tùy chỉnh sẽ vẫn thấy tất cả các typedef được kế thừa từ lớp cơ sở. Đây là cách 'boost :: iterator_facade' hoạt động. –

+0

@Emilie Tôi biết, nhưng giả sử cho các thùng chứa bạn phải cung cấp toán tử và những thứ khác sẽ sử dụng các loại đó. – Anycorn

+0

@aaa: Tôi luôn có thể sử dụng 'T',' T & ',' const T & ', vv Các typedef duy nhất mà tôi thực sự cần (trong khai báo) là' iterator' và 'const_iterator'. Tuy nhiên, tôi thừa nhận rằng có 'tham chiếu',' giá trị_type', v.v ... trong các khai báo hàm thành viên là đẹp hơn từ một điểm nhìn tài liệu. –