2012-08-22 43 views
6

Bạn đã bao giờ trải qua quá trình thay thế BOOST_FOREACH bằng vòng lặp for dựa trên phạm vi không? Có bất kỳ gotchas nào khi thực hiện nó máy móc (tức là không thực hiện nghiên cứu sâu về mã xung quanh).Bất kỳ trải nghiệm nào có thay thế BOOST_FOREACH theo phạm vi dựa trên vòng lặp từ C++ 11?

Thông tin cơ bản: Tôi có nguồn với khoảng 250K dòng, được biên soạn với Microsoft VC++ 10 (Visual Studio 2010). Mã này cũng sử dụng BOOST_FOREACH từ thư viện tăng cường. Tôi chỉ đang cố gắng VC++ 11 (Visual Studio 2012 RC) mà thực hiện cũng là phạm vi dựa trên for vòng lặp với auto.

Cho đến nay, tôi đã gặp những tình huống mà các phần tử được khai báo bên ngoài BOOST_FOREACH (không kê khai trong dấu ngoặc đơn):

BOOST_FOREACH (element, container) { 
    ... 
} 

... và element được dự kiến ​​sẽ có giá trị thiết lập trong lặp lại sau break. Bạn có thể nhớ các sự cố tương tự không?

Khi số BOOST_FOREACH chứa tuyên bố, bạn có chọn thay thế loại khiêu dâm bằng auto không? Có lợi thế nào để làm như vậy khi người ta chỉ viết lại máy BOOST_FOREACH thay vì để lại tuyên bố rõ ràng ở đó?

Nhờ sự giúp đỡ của bạn, Petr

Trả lời

4

Lợi thế của auto khi sử dụng loại thực tế hoặc loại tham chiếu là mã sẽ tiếp tục hoạt động nếu loại vùng chứa thay đổi. Đây có thể không phải là những gì bạn muốn nếu bạn đang cố ý thực hiện một loại chuyển đổi trên kết quả gián tiếp các iterator container.

Ví dụ:

std::vector<int> v; 
for (int i: v) ... 

Nếu v thay đổi std::vector<long> hoặc std::vector<unsigned> sau đó chuyển đổi loại hình có thể không mong muốn; vẫn còn, một cảnh báo trình biên dịch nên bắt này (đặc biệt là cho một chuyển đổi thu hẹp). Mặt khác, bạn có thể có mã nơi chuyển đổi (mở rộng) được dự định:

std::vector<char> v; 
for (int i: v) ... 
+0

Vâng, tôi hiểu rằng 'tự động' là người chiến thắng khi một mã mới được nhập - như viết của bạn. Tuy nhiên, tôi cảm thấy an toàn hơn một chút khi loại bỏ loại rõ ràng không được thay thế bằng 'tự động'.Thứ nhất, nó sẽ mất nhiều công sức hơn, và thứ hai, tôi có thể giới thiệu một lỗi của con người khi chỉnh sửa. (Có rất nhiều 'BOOST_FOREACH', và tôi không thể xem xét mã xung quanh cho từng trường hợp.) Dù sao, bạn sẽ xem xét quyết định của tôi để giữ kiểu dữ liệu rõ ràng trong các vòng lặp' for' mới như không- có vấn đề? – pepr

+0

@pepr Tôi đồng ý rằng việc giữ loại rõ ràng thường sẽ là lựa chọn tốt nhất; bạn sẽ cần phải biết về nó nếu thay đổi loại vùng chứa sau này. – ecatmur

1

bạn sẽ chọn để thay thế cho loại rõ ràng bằng cách tự động?

Có, nhưng nếu loại đó là int& thì tôi sẽ thay thế bằng auto& nếu không loại suy luận sẽ không là tham chiếu.

+0

Tôi không coi '& 'là một phần của' tự động' làm thành phần của bất kỳ loại dữ liệu nào có thể truy cập được hoặc thông qua giá trị hoặc thông qua tham chiếu. Câu hỏi của tôi có thể được đặt ra trước khi tôi có thể nhận được bất kỳ lợi thế nào do * thay thế kiểu dữ liệu rõ ràng bằng 'auto' *. Tốt hơn để nói, nếu thay thế 'BOOST_FOREACH' có thể được thực hiện thông qua một biểu thức chính quy trong IDE, cho dù nó có ý nghĩa để dành thời gian với việc thay thế thêm kiểu bằng' auto'. – pepr

+1

Ưu điểm chính là nếu sau này bạn thay đổi loại vùng chứa, với 'tự động' bạn không cần cập nhật biến vòng lặp. Bạn có thể tiết kiệm thời gian của bạn và để lại mã mà làm việc với các loại rõ ràng, không có gì sai với sự lựa chọn đó. –

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