2011-06-27 40 views
5

Vì biểu thức lambda yêu cầu phiên bản GCC> 4.4: cách chuyển mã nhanh nhất hoặc nhanh nhất (chưa quá 'bẩn') có chứa một vài biểu thức lambda với các biến tham chiếu đến mã pre-C++ 0x?Thanh công khai các biểu thức lambda trong C++

Điều này có thể được thực hiện theo cách bán tự động bằng cách sử dụng mẫu/macro không?

Trả lời

6

Có thể bạn nên xem boost::lambda. Điều này sẽ làm những gì bạn đang tìm kiếm.

+0

+1. Tôi đã sử dụng boost :: lambda một chút, nhưng tôi thấy nó khá khó xử theo một số cách. Bạn không thể trực tiếp sử dụng các phương thức trên lambda args. Ví dụ bạn không thể làm 'sort (v.begin(), v.end(), _1.size() <_2.size())' nhưng bạn có thể làm 'sort (v.begin(), v. kết thúc(), f (_1)

+1

Khi tăng 1,47 (hiện đang trong giai đoạn thử nghiệm và sẽ được phát hành trong vài tuần tới), Boost.Lambda chính thức không được chấp nhận và thay thế bằng [Boost.Phoenix v3] (http://beta.boost.org/libs/phoenix/index.html), vì vậy Boost.Phoenix là một đề xuất tốt hơn vào thời điểm này. – ildjarn

+1

@Aaron: Boost.Phoenix chứa các trình bao bọc [lazy wrapper] cho tất cả các thư viện và các thuật toán tiêu chuẩn] (http://beta.boost.org/libs/phoenix/doc/html/phoenix/modules/stl.html), vì vậy sẽ trông giống như 'sắp xếp (v.begin, v.end(), kích thước (_1) ildjarn

2

(Disclaimer:. Tôi đang liên kết đến trang web của riêng tôi)

Khoảng một năm trước, tôi đặt một vài macro hữu ích về một a blog post of mine. Tôi không biết nó di động như thế nào, và nó khá hạn chế. Nhưng đối với các biểu thức đơn giản, nó hoạt động tốt.

Lưu ý rằng tôi đã không tìm thấy nhiều sử dụng cho bản thân mình, vì vậy nó không thể là rằng :-) tốt

sort(vs.begin(), vs.end(), 
YALM(bool,vector<int>&,vector<int>&,return l.size() < r.size() ) 
);