ปัญหานี้แก้ปัญหาอะไร
ดูคำตอบ Dietmar ของและคำตอบของ remyabel
และสิ่งนี้เปลี่ยนวิธีการทำงานของคอนเทนเนอร์มาตรฐานหรือไม่
ไม่ไม่ใช่โดยค่าเริ่มต้น
เทมเพลตฟังก์ชันสมาชิกใหม่มีการโอเวอร์โหลดfind
ฯลฯ ช่วยให้คุณสามารถใช้ประเภทที่เทียบเคียงได้กับคีย์ของคอนเทนเนอร์แทนที่จะใช้ประเภทคีย์เอง ดูN3465โดยJoaquínMªLópezMuñozสำหรับเหตุผลและข้อเสนอที่เขียนอย่างละเอียดและละเอียดเพื่อเพิ่มคุณสมบัตินี้
ในการประชุมบริสตอล LWG เห็นพ้องกันว่าคุณลักษณะการค้นหาที่หลากหลายมีประโยชน์และเป็นที่ต้องการ แต่เราไม่สามารถมั่นใจได้ว่าข้อเสนอของJoaquínจะปลอดภัยในทุกกรณี ข้อเสนอ N3465 อาจทำให้เกิดปัญหาร้ายแรงสำหรับบางโปรแกรม (ดูส่วนผลกระทบต่อโค้ดที่มีอยู่ ) Joaquínเตรียมร่างข้อเสนอที่อัปเดตพร้อมการใช้งานทางเลือกบางอย่างพร้อมการแลกเปลี่ยนที่แตกต่างกันซึ่งมีประโยชน์มากในการช่วยให้ LWG เข้าใจข้อดีข้อเสีย แต่พวกเขาทั้งหมดเสี่ยงที่จะทำลายบางโปรแกรมไม่ทางใดก็ทางหนึ่งดังนั้นจึงไม่มีฉันทามติที่จะเพิ่มคุณสมบัติ เราตัดสินใจว่าแม้ว่าจะไม่ปลอดภัยที่จะเพิ่มคุณลักษณะนี้โดยไม่มีเงื่อนไข แต่จะปลอดภัยหากปิดใช้งานโดยค่าเริ่มต้นและ "เลือกใช้" เท่านั้น
ความแตกต่างที่สำคัญของข้อเสนอN3657 (ซึ่งเป็นการแก้ไขในนาทีสุดท้ายโดยตัวฉันเองและ STL ตาม N3465และแบบร่างที่ไม่ได้เผยแพร่ในภายหลังโดยJoaquín) คือการเพิ่มis_transparent
ประเภทเป็นโปรโตคอลที่สามารถใช้เพื่อเลือกใช้ฟังก์ชันใหม่ได้
หากคุณไม่ใช้ "ฟังก์ชั่นโปร่งใส" (เช่นตัวที่กำหนดไฟล์ is_transparent
ประเภท) คอนเทนเนอร์จะทำงานเหมือนกับที่เคยทำมาตลอดและนั่นยังคงเป็นค่าเริ่มต้น
Iff คุณเลือกใช้ std::less<>
(ซึ่งใหม่สำหรับ C ++ 14) หรือ "ฟังก์ชั่นโปร่งใส" ประเภทอื่นคุณจะได้รับฟังก์ชันใหม่
ใช้std::less<>
งานง่ายด้วยเทมเพลตนามแฝง:
template<typename T, typename Cmp = std::less<>, typename Alloc = std::allocator<T>>
using set = std::set<T, Cmp, Alloc>;
ชื่อis_transparent
นี้มาจากN3421ของ STL ซึ่งเพิ่ม "ตัวดำเนินการเพชร" ให้กับ C ++ 14 "ตัวดำเนินการโปร่งใส" คือสิ่งที่ยอมรับประเภทอาร์กิวเมนต์ (ซึ่งไม่จำเป็นต้องเหมือนกัน) และเพียงแค่ส่งต่ออาร์กิวเมนต์เหล่านั้นไปยังตัวดำเนินการอื่น functor ดังกล่าวเป็นสิ่งที่คุณต้องการสำหรับการค้นหาที่แตกต่างกันในคอนเทนเนอร์แบบเชื่อมโยงดังนั้นประเภทis_transparent
จึงถูกเพิ่มให้กับตัวดำเนินการเพชรทั้งหมดและใช้เป็นประเภทแท็กเพื่อระบุว่าควรเปิดใช้งานฟังก์ชันใหม่ในคอนเทนเนอร์ที่เชื่อมโยงกัน ในทางเทคนิคแล้วคอนเทนเนอร์ไม่จำเป็นต้องมี "ฟังก์ชั่นโปร่งใส" เพียงอันเดียวที่รองรับการเรียกด้วยประเภทที่แตกต่างกัน (เช่นpointer_comp
ประเภทในhttps://stackoverflow.com/a/18940595/981959ไม่โปร่งใสตามคำจำกัดความของ STLpointer_comp::is_transparent
ช่วยให้สามารถใช้เพื่อแก้ปัญหาได้) หากคุณเคยค้นหาstd::set<T, C>
ด้วยคีย์ประเภทT
หรือint
จากนั้นC
จำเป็นต้องสามารถเรียกได้ด้วยอาร์กิวเมนต์ประเภทT
และint
(เรียงตามลำดับ) ไม่จำเป็นต้องโปร่งใสอย่างแท้จริง เราใช้ชื่อนั้นส่วนหนึ่งเป็นเพราะเราไม่สามารถหาชื่อที่ดีกว่านี้ได้ (ฉันต้องการis_polymorphic
เพราะ functors ดังกล่าวใช้ความหลากหลายแบบคงที่ แต่มีstd::is_polymorphic
ลักษณะประเภทหนึ่งที่อ้างถึงความหลากหลายแบบไดนามิกอยู่แล้ว)