C ++ 20 มีกลไกสำหรับการตัดสินใจเมื่อเอนทิตีที่ จำกัด อย่างใดอย่างหนึ่งคือ "จำกัด มากขึ้น" มากกว่าเอนทิตีอื่น นี่ไม่ใช่เรื่องง่าย
เริ่มต้นนี้กับแนวคิดของการที่จะหมดลง จำกัด เป็นส่วนประกอบอะตอมซึ่งเป็นกระบวนการที่เรียกว่าข้อ จำกัด การฟื้นฟู มันใหญ่และซับซ้อนเกินกว่าจะเข้าไปที่นี่ได้ แต่แนวคิดพื้นฐานคือแต่ละนิพจน์ในข้อ จำกัด นั้นแบ่งออกเป็นชิ้นส่วนแนวคิดอะตอมของมันซ้ำ ๆ จนกว่าคุณจะถึงส่วนประกอบย่อยที่ไม่ใช่แนวคิด
จากนั้นให้ดูที่วิธีการintegral
และsigned_integral
แนวคิดที่กำหนด :
template<class T>
concept integral = is_integral_v<T>;
template<class T>
concept signed_integral = integral<T> && is_signed_v<T>;
การสลายตัวของเป็นเพียงintegral
is_integral_v
การสลายตัวของมีsigned_integral
is_integral_v && is_signed_v
ตอนนี้เรามาถึงแนวคิดของข้อ จำกัด การย่อย มันค่อนข้างซับซ้อน แต่ความคิดพื้นฐานคือข้อ จำกัด C1 ถูกกล่าวถึง "subsume" ข้อ จำกัด C2 หากการสลายตัวของ C1 มีทุกนิพจน์ย่อยใน C2 เราจะเห็นว่าintegral
ไม่ subsume signed_integral
แต่signed_integral
ไม่ subsume integral
เพราะมันมีทุกสิ่งที่integral
ทำ
ต่อไปเรามาสั่งซื้อเอนทิตีที่ จำกัด :
การประกาศ D1 อย่างน้อยที่สุดก็เป็นข้อ จำกัด เหมือนกับการประกาศ D2 ถ้า * D1 และ D2 เป็นทั้งการประกาศแบบ จำกัด และข้อ จำกัด ที่เกี่ยวข้องของ D1 จะรวมอยู่ในการประกาศ D2 หรือ * D2 ไม่มีข้อ จำกัด ที่เกี่ยวข้อง
เพราะsigned_integral
subsumes integral
ที่<signed_integral> wrapper
เป็น "อย่างน้อยเป็นข้อ จำกัด" <integral> wrapper
เป็น อย่างไรก็ตามการย้อนกลับไม่เป็นความจริงเนื่องจากการ subsumption ไม่สามารถย้อนกลับได้
ดังนั้นตามกฎสำหรับเอนทิตี "ที่ จำกัด มากขึ้น":
การประกาศ D1 มีข้อ จำกัด มากกว่าการประกาศอื่น D2 เมื่อ D1 มีข้อ จำกัด อย่างน้อยเท่ากับ D2 และอย่างน้อย D2 จะไม่ถูก จำกัด เท่ากับ D1
เนื่องจาก<integral> wrapper
ข้อ จำกัด ดังกล่าวไม่ได้เป็นอย่างน้อย<signed_integral> wrapper
จึงถือว่าเป็นข้อ จำกัด ที่มากกว่าข้อ จำกัด เดิม
ดังนั้นเมื่อทั้งสองคนสามารถใช้งานได้การประกาศที่มีข้อ จำกัด มากขึ้นก็จะชนะ
โปรดทราบว่ากฎของ subsumption จำกัดหยุดconcept
เมื่อมีการแสดงออกจะพบซึ่งไม่ได้เป็น ดังนั้นหากคุณทำสิ่งนี้:
template<typename T>
constexpr bool my_is_integral_v = std::is_integral_v<T>;
template<typename T>
concept my_signed_integral = my_is_integral_v<T> && std::is_signed_v<T>;
ในกรณีนี้my_signed_integral
จะไม่std::integral
subsume แม้ว่าจะmy_is_integral_v
มีการกำหนดเหมือนกันstd::is_integral_v
เนื่องจากไม่ใช่แนวคิดกฎการปันส่วนของ C ++ ไม่สามารถตรวจสอบได้เพื่อตรวจสอบว่ากฎนั้นเหมือนกัน
ดังนั้นกฎการสนับสนุนให้คุณสร้างแนวคิดจากการดำเนินการตามแนวคิดอะตอมมิก