(หมายเหตุ: tupleและtieสามารถนำมาจาก Boost หรือ C ++ 11)
เมื่อเขียนโครงสร้างขนาดเล็กที่มีเพียงสององค์ประกอบบางครั้งฉันมักจะเลือก a std::pairเนื่องจากมีการทำสิ่งสำคัญทั้งหมดสำหรับประเภทข้อมูลนั้นแล้วเช่นoperator<การจัดลำดับที่เข้มงวด - อ่อนแอ .
ข้อเสียคือชื่อตัวแปรที่ค่อนข้างไร้ประโยชน์ แม้ว่าฉันจะสร้างสิ่งนั้นขึ้นมาเองtypedefแต่ฉันก็จำไม่ได้ว่า 2 วันต่อมาว่าfirstอะไรsecondคืออะไรโดยเฉพาะอย่างยิ่งถ้าทั้งสองเป็นประเภทเดียวกัน สิ่งนี้จะแย่ลงไปอีกสำหรับสมาชิกมากกว่าสองคนเนื่องจากการทำรังนั้นpairค่อนข้างแย่มาก
อีกทางเลือกหนึ่งคือไฟล์tupleไม่ว่าจะจาก Boost หรือ C ++ 11 แต่ก็ไม่ได้ดูดีและชัดเจนขึ้น ดังนั้นฉันจึงกลับไปเขียนโครงสร้างด้วยตัวเองรวมถึงตัวดำเนินการเปรียบเทียบที่จำเป็น
เนื่องจากโดยเฉพาะอย่างยิ่งoperator<อาจเป็นเรื่องยุ่งยากฉันจึงคิดที่จะหลีกเลี่ยงความยุ่งเหยิงทั้งหมดนี้โดยอาศัยการดำเนินการที่กำหนดไว้สำหรับtuple:
ตัวอย่างoperator<เช่นสำหรับการสั่งซื้อที่เข้มงวด - อ่อนแอ:
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ทำให้tupleของT&การอ้างอิงจากการขัดแย้งผ่าน.)
แก้ไข : ข้อเสนอแนะจาก @DeadMG ถึงการสืบทอดแบบส่วนตัวtupleไม่ใช่เรื่องเลวร้าย แต่ก็มีข้อเสียอยู่บ้าง:
- หากผู้ดำเนินการมีสถานะอิสระ (อาจเป็นเพื่อนกัน) ฉันต้องสืบทอดต่อสาธารณะ
- ด้วยการแคสต์ฟังก์ชัน / ตัวดำเนินการของฉัน (
operator=โดยเฉพาะ) สามารถข้ามได้อย่างง่ายดาย - ด้วย
tieวิธีแก้ปัญหาฉันสามารถละทิ้งสมาชิกบางคนได้หากพวกเขาไม่สำคัญสำหรับการสั่งซื้อ
มีข้อบกพร่องใด ๆ ในการใช้งานนี้ที่ฉันต้องพิจารณาหรือไม่?