2009-04-04 21 views
22

Điều này dành cho chuyên gia Tăng cường. Có bất kỳ gotchas hoặc chi tiết mà các lập trình viên cần phải được nhận thức của trước khi ông đi vào và thay thế tất cả các vòng C/C++ phong cách cũ của mình với nạc-và-có nghĩa là tìm kiếm BOOST_FOREACH?C++ Boost: Bất kỳ gotchas nào với BOOST_FOREACH?

(Câu hỏi này một phần bắt nguồn từ here.)

Trả lời

10

Hãy xem tại địa chỉ:

  • các Conditional Love bài viết cho một sự hiểu biết về lý do
  • các Pitfalls phần của tài liệu
  • Các Portability phần chỉ trong trường hợp bạn đang phát triển các sản phẩm đa nền tảng
  • Trang lỗi cho BOOST_FOREACH
+1

Điểm 1 có phải là vấn đề đối với BOOST_FOREACH không? Khi tôi hiểu nó BOOST_FOREACH, đánh giá từng tham số một lần và chỉ một lần. Không? "Nó đánh giá các đối số của nó chính xác một lần, dẫn đến không có bất ngờ khó chịu" --docs – Catskul

4

Hãy nhìn vào nguồn gốc của các vĩ mô BOOST_FOREACH (trong foreach.hpp) - nó không phải là những gì tôi sẽ gọi "nạc và có nghĩa là" :-)

8

Vì nó chỉ là một macro, bạn có thể không sử dụng dấu phẩy trong typenames, vì vậy
BOOST_FOREACH(pair<int,int> A, mapB){}
sẽ không hoạt động.
Vì những bất lợi khác, tôi muốn tham khảo BOOST_FOREACH() documentation.

+0

Tôi tin rằng BOOST_FOREACH ((cặp A), mapB) sẽ hoạt động. Đã không kiểm tra mặc dù. –

+0

Sẽ không làm việc, và tôi đã dành nửa ngày cố gắng để tìm nó, cho đến khi nó đột nhiên nghiêm khắc tôi nó là một vĩ mô. Macro không hiểu mẫu và họ nghĩ rằng dấu phẩy chỉ là một đối số khác để thay thế –

+0

'auto' là bạn của bạn! 'BOOST_FOREACH (tự động, mapB) {...}' – Gabriel

9

BOOST_FOREACH - macro, tôi không thích macro và thích sử dụng thuật toán STL + lambda + bind.

Cũng C++0x sẽ chứa for-loop tương tự trên BOOST_FOREACH:

int my_array[5] = {1, 2, 3, 4, 5}; 
for(int &x : my_array) 
{ 
    x *= 2; 
} 

nó là một trong những lý do bổ sung cho không sử dụng BOOST_FOREACH partialy chết.

+2

Thực ra, đây là lý do tôi bắt đầu sử dụng BOOST_FOREACH.Cú pháp tương tự đủ để một khi cấu trúc C++ 0x có sẵn, bạn có thể cập nhật mã của bạn bằng thao tác tìm kiếm và thay thế regex đơn giản. – Ferruccio

+1

Tôi hoài nghi, rất hoài nghi. tr1 vẫn không có sẵn ở khắp mọi nơi và đó là một thời gian dài trước đây. C++ 09 sẽ hoàn toàn có thể sử dụng vào năm 2020 với tốc độ này, nếu C++ không chết vì sưng lên. –

+0

Có, một số người không sử dụng/giống như STL trong thời gian này và sẽ không sử dụng các tính năng C++ 0x mới cho đến năm 2020. Nhưng các sự kiện tiếp theo: Bộ biên dịch VC và GCC đã hỗ trợ một số tính năng C++ 0x. – bayda

7

Tôi đã lược tả BOOST_FOREACH so với vòng lặp được mã hóa bằng tay. BOOST_FOREACH chậm hơn khoảng 30% trong một vòng lặp đơn giản làm tăng các phần tử của vectơ có kích thước 100.000. Vì vậy, nếu bạn đang mã hóa một vòng lặp nhỏ, nó sẽ không được nhanh như vậy. Một khi vòng lặp của bạn xử lý lớn, Luật của Amdahl bắt đầu và mất mát do BOOST_FOREACH là không đáng kể.

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