2008-08-13 23 views
29

Tôi đang cố gắng tìm cách chung để truy cập tập hợp các vùng chứa. Tôi có một vector và danh sách tiêu chuẩn ngoài một danh sách tùy chỉnh khác.Trình biến đổi chung

Danh sách tùy chỉnh xác định trình lặp;

class Iterator: public std::iterator<std::forward_iterator_tag, T> { 
    // ... 
} 

Iterator begin() { 
    return (Iterator(root)); 
} 

Iterator end() { 
    return (Iterator(NULL)); 
} 

với các toán tử thích hợp bị quá tải.

Lý tưởng nhất, tôi muốn thực hiện việc này;

class Foo { 
public: 
    Foo() { 
     std::list<int> x; 
     std::vector<int> y; 
     custom_list<int> z; 

     iter = x.begin(); // OR 
     iter = y.begin(); // OR 
     iter = z.begin(); 

     // ... 
    }; 
private: 
    std::iterator<int> iter; 
}; 

Nhưng rõ ràng đây là tất cả các trình lặp của các loại khác nhau. Tôi có thể giả định tất cả các thùng chứa đều có cùng loại.

Có cách nào thanh lịch để giải quyết vấn đề này không?

Trả lời

2

Muộn còn hơn không bao giờ ...

Vấn đề mới nhất của C-Vu bật lên và đoán xem có gì trong đó: Đúng vậy, vòng lặp làm chính xác những gì bạn muốn.

Thật không may bạn cần trở thành thành viên của ACCU để xem tạp chí (bài viết tham chiếu bài viết quá tải từ năm 2000 mà David liên kết đến). Nhưng đối với một mức giá measly một năm bạn nhận được một tạp chí tốt đẹp để đọc, hội nghị và các nhóm người dùng. Khi bạn trở thành thành viên, bạn có thể xem các vấn đề sau của PDF để what are you waiting for?

+2

Có thể hữu ích nếu bạn đã đề cập rằng bài viết được tìm thấy trong số phát hành vol 20 ngày 3 tháng 6 có tiêu đề Bộ lặp Iterator trong C++. hình ảnh người dùng đẹp btw. – danio

1

Trường hợp phải cẩn thận những gì bạn yêu cầu. Lớp any_iterator bạn nhìn thấy hoạt động trên một tập hợp các loại vòng lặp không bị chặn. Bạn chỉ có ba, mà bạn biết lên phía trước. Chắc chắn, bạn có thể cần phải thêm một loại thứ tư trong tương lai, nhưng vì vậy điều gì sẽ xảy ra nếu có thêm O (1) dòng mã bổ sung?

Lợi thế lớn của một tập hợp các loại có thể có là bạn có giới hạn trên về sizeof(), điều đó có nghĩa là bạn có thể tránh được vùng heap và hướng dẫn mà nó mang lại. Về cơ bản, công cụ tất cả chúng trong một tăng :: biến thể và gọi apply_visitor.

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