Phạm vi mới dựa trên các vòng thực sự cải thiện khả năng đọc và thực sự dễ sử dụng. Tuy nhiên, hãy xem xét những điều sau đây:C++ 11 dựa trên phạm vi và bản đồ: khả năng đọc
map<Foo,Bar> FooAndAssociatedBars;
for (auto& FooAndAssociatedBar : FooAndAssociatedBars) {
FooAndAssociatedBar.first.doSth();
FooAndAssociatedBar.second.doSomeOtherThing();
}
Nó có thể là một chi tiết nhưng tôi thấy nó đã có thể đọc được nhiều hơn nếu tôi có thể làm điều gì đó như:
for ((auto& foo, auto& bar) : FooAndAssociatedBars) {
foo.doSth();
bar.doSomeOtherThing();
}
Bạn có biết một cú pháp tương đương?
EDIT: Tin tốt: C++ 17 có một đề nghị rằng adresses vấn đề này, được gọi là các ràng buộc có cấu trúc (xem 1). Trong C++ 17, bạn sẽ có thể viết:
tuple<T1,T2,T3> f(/*...*/) {
/*...*/
return {a,b,c};
}
auto [x,y,z] = f(); // x has type T1, y has type T2, z has type T3
mà giải quyết vấn đề dễ đọc này
Trình biên dịch đoán câu 'Foo' và' Bar' có nghĩa là gì? –
@PeteBecker Vâng, foo chỉ là một cách thuận tiện để nói "tên foo phần bên trái của std :: cặp". Nói một cách tuyệt đối, có thể thực hiện điều này vào thời gian biên dịch: đây chỉ là một sự thuận tiện không hợp lý. Tôi đã tự hỏi nếu nó có thể có được hiệu ứng như vậy thông qua quá tải hoặc một cái gì đó như thế –
Có, nó chắc chắn có thể yêu cầu trình biên dịch để biết về 'std :: pair' hoặc để tìm bất kỳ struct với các yếu tố có tên' first' và ' thứ hai'; đó là khá chuyên môn, và có lẽ không thích hợp cho việc tiêu chuẩn hóa. Yêu cầu tiếp theo sẽ là cho tất cả các phần tử của 'tuple' ... –