2012-10-10 40 views
5

Các mã sau biên dịch tốt trên hệ thống của tôi:vòng lặp để mảng có kích thước khác nhau

#include <array> 
#include <type_traits> 

static_assert(std::is_same<std::array<int, 5>::iterator, 
          std::array<int, 7>::iterator>::value, ":("); 

Có phải đó là hành vi được bảo đảm theo tiêu chuẩn? Loại trình vòng lặp có độc lập với kích thước mảng không?

Nếu được đảm bảo, có cách nào trừu tượng từ loại phần tử và bỏ qua kích thước không?

template<typename T, size_t n> 
void foobar(std::array<T, n>::iterator it) 

Tức là, có cách nào để viết mã cụ thể trên mảng mà không đề cập đến kích thước n?

Lưu ý rằng tôi không muốn sử dụng đến T*, mặc dù ở chế độ phát hành, trình lặp có thể là T*.

+0

Có gì sai với 'template void foobar (Itearator_type it)'? – Lol4t0

+1

@ Lol4t0 Nó quá chung chung và không thỏa mãn cơn khát của tôi về kiến ​​thức? – fredoverflow

+0

Ý tôi là, nếu mã hoạt động cho trình biến đổi _given_, tại sao một mã lệnh áp đặt giới hạn nhân tạo? 2 bình luận này chỉ kết nối với phần cuối của câu hỏi của bạn, về nguyên nhân. – Lol4t0

Trả lời

3

Không, nó không được bảo đảm. Mỗi loại mảng array<T, size_t> có một typedef thành viên lồng nhau tên là iterator có loại được thực hiện xác định.

1

Câu trả lời đơn giản là làm cho nó chung chung hơn một chút. Tại sao bạn chỉ muốn cho phép các trình lặp từ một số std::array?

template <typename Iterator> 
void foobar(Iterator it) 

Trong phần thứ hai của mã, kiểu T và kích thước n đang ở trong một bối cảnh phi deducible. Về mặt lý thuyết nhiều std::array loại có thể có cùng một iterator loại, hoặc như bạn đề cập đến nó chỉ có thể T*, và nó sẽ không thể tìm thấy những gì có thể std::array đã có một T* như iterator

+0

Trên thực tế, câu trả lời * thực tế * thậm chí là * đơn giản *: *" Không, điều này không được đảm bảo theo tiêu chuẩn. "* –

4

Không, không có bảo đảm. Tiêu chuẩn này chỉ nói

typedef implementation-defined iterator; 

Các loại iterator có thể là một con trỏ đơn giản, một lớp học mà là một thành viên của array, hoặc một lớp riêng biệt gói con trỏ đơn giản.

Nếu đó là một lớp thành viên, nó sẽ phụ thuộc vào kích thước mảng. Nếu không thì không.

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