(หมายเหตุ: 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
วิธีแก้ปัญหาฉันสามารถละทิ้งสมาชิกบางคนได้หากพวกเขาไม่สำคัญสำหรับการสั่งซื้อ
มีข้อบกพร่องใด ๆ ในการใช้งานนี้ที่ฉันต้องพิจารณาหรือไม่?