(Lưu ý: tuple
và tie
có thể được lấy từ Boost hoặc C ++ 11.)
Khi viết cấu trúc nhỏ chỉ có hai phần tử, đôi khi tôi có xu hướng chọn a std::pair
, vì tất cả những thứ quan trọng đã được thực hiện cho kiểu dữ liệu đó, như operator<
đối với thứ tự nghiêm ngặt-yếu .
Tuy nhiên, nhược điểm là các tên biến vô dụng. Ngay cả khi chính tôi đã tạo ra nó typedef
, tôi sẽ không nhớ 2 ngày sau đó là gì first
và second
chính xác là gì , đặc biệt nếu cả hai đều thuộc cùng một loại. Điều này thậm chí còn tồi tệ hơn đối với nhiều hơn hai thành viên, vì việc lồng vào nhau pair
sẽ rất tệ.
Tùy chọn khác cho điều đó làtuple
, từ Boost hoặc C ++ 11, nhưng điều đó không thực sự trông đẹp và rõ ràng hơn. Vì vậy, tôi quay lại việc tự viết cấu trúc, bao gồm bất kỳ toán tử so sánh nào cần thiết.
Vì đặc biệt là operator<
có thể khá cồng kềnh, tôi đã nghĩ đến việc giải quyết toàn bộ mớ hỗn độn này bằng cách chỉ dựa vào các phép toán được xác định cho tuple
:
Ví dụ về operator<
, ví dụ cho thứ tự nghiêm ngặt-yếu:
bool operator<(MyStruct const& lhs, MyStruct const& rhs){
return std::tie(lhs.one_member, lhs.another, lhs.yet_more) <
std::tie(rhs.one_member, rhs.another, rhs.yet_more);
}
( tie
Làm cho một tuple
số T&
tài liệu tham khảo từ các đối số được thông qua.)
Chỉnh sửa : Đề xuất từ @DeadMG để kế thừa riêng tư tuple
không phải là một đề xuất xấu, nhưng nó có một số nhược điểm:
- Nếu các nhà khai thác là tự do (có thể là bạn bè), tôi cần kế thừa công khai
- Với truyền, các hàm / toán tử của tôi (
operator=
cụ thể) có thể dễ dàng bị bỏ qua - Với
tie
giải pháp, tôi có thể loại bỏ một số thành viên nếu họ không quan trọng đối với việc đặt hàng
Có bất kỳ hạn chế nào trong việc triển khai này mà tôi cần xem xét không?
tie
không thể áp dụng cho các thành viên trường bit.
tie(...)
cuộc gọi sẽ bị trùng lặp trong các toán tử khác nhau (=, ==, <, v.v.), bạn có thể viết một phương thức nội tuyến riêng make_tuple(...)
để đóng gói nó và sau đó gọi nó từ nhiều nơi khác, như trong return lhs.make_tuple() < rhs.make_tuple();
(mặc dù kiểu trả về từ phương pháp đó có thể thú vị để khai báo!)
auto tied() const{ return std::tie(the, members, here); }