ข้อมูลต่อไปนี้ล้าสมัย จำเป็นต้องได้รับการอัปเดตตามแบบร่าง Concepts Lite ล่าสุด
ส่วนที่ 3 ของข้อเสนอข้อ จำกัดครอบคลุมประเด็นนี้ในเชิงลึกที่สมเหตุสมผล
ข้อเสนอแนวความคิดถูกวางไว้บนเตาเผาด้านหลังในช่วงสั้น ๆ ด้วยความหวังว่าข้อ จำกัด (เช่นแนวคิด - ไลต์) จะถูกทำให้หมดไปและนำไปใช้ในช่วงเวลาที่สั้นลงโดยมีเป้าหมายอย่างน้อยใน C ++ 14 ข้อเสนอข้อ จำกัด ได้รับการออกแบบมาเพื่อใช้ในการเปลี่ยนไปใช้นิยามแนวคิดในภายหลังได้อย่างราบรื่น ข้อ จำกัด เป็นส่วนหนึ่งของข้อเสนอแนวคิดและเป็นส่วนประกอบที่จำเป็นในคำจำกัดความ
ในการออกแบบ Concept Libraries สำหรับ C ++ Sutton และ Stroustrup พิจารณาความสัมพันธ์ต่อไปนี้:
แนวคิด = ข้อ จำกัด + สัจพจน์
สรุปความหมายได้อย่างรวดเร็ว:
- ข้อ จำกัด - เพรดิเคตเหนือคุณสมบัติที่ประเมินได้แบบคงที่ของชนิด ข้อกำหนดทางวากยสัมพันธ์ล้วนๆ ไม่ใช่สิ่งที่เป็นนามธรรมของโดเมน
- สัจพจน์ - ข้อกำหนดทางความหมายของประเภทที่ถือว่าเป็นจริง ไม่ได้ตรวจสอบแบบคงที่
- แนวคิด - ข้อกำหนดทั่วไปที่เป็นนามธรรมของอัลกอริทึมเกี่ยวกับอาร์กิวเมนต์ กำหนดในแง่ของข้อ จำกัด และสัจพจน์
ดังนั้นหากคุณเพิ่มสัจพจน์ (คุณสมบัติทางความหมาย) ในข้อ จำกัด (คุณสมบัติทางวากยสัมพันธ์) คุณจะได้รับแนวคิด
Concepts-Lite
ข้อเสนอแนวความคิดนำเสนอเฉพาะส่วนแรกข้อ จำกัด เท่านั้น แต่นี่เป็นขั้นตอนที่สำคัญและจำเป็นต่อแนวคิดที่ครบถ้วนสมบูรณ์
ข้อ จำกัด
ข้อ จำกัด ทั้งหมดเกี่ยวกับไวยากรณ์ พวกเขาให้วิธีการแยกแยะคุณสมบัติของประเภทในเวลาคอมไพล์เพื่อให้เราสามารถ จำกัด ประเภทที่ใช้เป็นอาร์กิวเมนต์แม่แบบตามคุณสมบัติทางวากยสัมพันธ์ ในข้อเสนอปัจจุบันสำหรับข้อ จำกัด ของพวกเขาจะแสดงความมีส่วนย่อยของแคลคูลัสเชิงประพจน์โดยใช้ตรรกะ connectives ชอบและ&&
||
มาดูข้อ จำกัด ในการดำเนินการ:
template <typename Cont>
requires Sortable<Cont>()
void sort(Cont& container);
sort
ที่นี่เราจะกำหนดแม่แบบฟังก์ชั่นที่เรียกว่า นอกจากนี้ใหม่เป็นต้องใช้ประโยค ประโยคต้องการให้ข้อ จำกัด บางประการเกี่ยวกับอาร์กิวเมนต์แม่แบบสำหรับฟังก์ชันนี้ โดยเฉพาะข้อ จำกัด นี้บอกว่าประเภทCont
ต้องเป็นSortable
ประเภท สิ่งที่เรียบร้อยคือสามารถเขียนในรูปแบบที่กระชับมากขึ้นเป็น:
template <Sortable Cont>
void sort(Cont& container);
ตอนนี้ถ้าคุณพยายามส่งผ่านอะไรก็ตามที่ไม่ได้รับการพิจารณาSortable
ให้ใช้ฟังก์ชันนี้คุณจะได้รับข้อผิดพลาดที่แจ้งให้คุณทราบทันทีว่าประเภทที่อนุมานสำหรับT
ไม่ใช่Sortable
ประเภท ถ้าคุณได้ทำใน C ++ 11 คุณจะมีข้อผิดพลาดที่น่ากลัวบางอย่างโยนลงมาจากภายในsort
ฟังก์ชั่นที่ทำให้รู้สึกไม่ให้ใคร
เงื่อนไขข้อ จำกัด มีความคล้ายคลึงกับลักษณะประเภทมาก พวกเขาใช้ประเภทอาร์กิวเมนต์แม่แบบและให้ข้อมูลบางอย่างเกี่ยวกับเรื่องนี้ ข้อ จำกัด พยายามที่จะตอบคำถามเกี่ยวกับประเภทต่อไปนี้:
- ประเภทนี้มีตัวดำเนินการดังกล่าวมากเกินไปหรือไม่?
- ประเภทเหล่านี้สามารถใช้เป็นตัวถูกดำเนินการกับตัวดำเนินการนี้ได้หรือไม่
- ประเภทนี้มีลักษณะเช่นนี้หรือไม่?
- นิพจน์คงที่นี้เท่ากับหรือไม่? (สำหรับอาร์กิวเมนต์แม่แบบที่ไม่ใช่ประเภท)
- ประเภทนี้มีฟังก์ชันที่เรียกว่า yada-yada ที่ส่งกลับประเภทนั้นหรือไม่?
- ประเภทนี้ตรงตามข้อกำหนดทางวากยสัมพันธ์ทั้งหมดที่จะใช้ตามนั้นหรือไม่
อย่างไรก็ตามข้อ จำกัด ไม่ได้มีไว้เพื่อแทนที่ลักษณะประเภท แต่พวกเขาจะร่วมมือกัน คุณสมบัติบางประเภทสามารถกำหนดได้ในแง่ของแนวคิดและแนวคิดบางอย่างในแง่ของลักษณะประเภท
ตัวอย่าง
ดังนั้นสิ่งที่สำคัญเกี่ยวกับข้อ จำกัด ก็คือพวกเขาไม่สนใจเกี่ยวกับความหมายหนึ่ง iota ตัวอย่างที่ดีของข้อ จำกัด ได้แก่ :
Equality_comparable<T>
: ตรวจสอบว่าประเภทมี==
ตัวถูกดำเนินการทั้งสองประเภทเดียวกันหรือไม่
Equality_comparable<T,U>
: ตรวจสอบว่ามี==
ตัวถูกดำเนินการด้านซ้ายและขวาของประเภทที่กำหนดหรือไม่
Arithmetic<T>
: ตรวจสอบว่าประเภทนั้นเป็นประเภทเลขคณิตหรือไม่
Floating_point<T>
: ตรวจสอบว่าประเภทนั้นเป็นประเภททศนิยมหรือไม่
Input_iterator<T>
: ตรวจสอบว่าประเภทสนับสนุนการดำเนินการทางวากยสัมพันธ์ที่ตัววนซ้ำอินพุตต้องรองรับหรือไม่
Same<T,U>
: ตรวจสอบว่าประเภทที่ระบุเหมือนกันหรือไม่
คุณสามารถลองออกทั้งหมดนี้ด้วยพิเศษสร้างแนวคิด-Lite ของ GCC
นอกเหนือจาก Concepts-Lite
ตอนนี้เราเข้าสู่ทุกสิ่งนอกเหนือจากข้อเสนอแนวความคิด นี่เป็นอนาคตที่ยิ่งใหญ่กว่าอนาคต ทุกอย่างต่อจากนี้ไปมีแนวโน้มที่จะเปลี่ยนแปลงไม่น้อย
สัจพจน์
สัจพจน์ทั้งหมดเกี่ยวกับความหมาย พวกเขาระบุความสัมพันธ์ความไม่แน่นอนการรับประกันความซับซ้อนและสิ่งอื่น ๆ ลองดูตัวอย่าง
แม้ว่าEquality_comparable<T,U>
ข้อ จำกัด จะบอกคุณว่ามีoperator==
ประเภทที่ต้องใช้T
และU
แต่ก็ไม่ได้บอกคุณว่าการดำเนินการนั้นหมายถึงอะไร Equivalence_relation
เพื่อที่เราจะมีความจริง สัจพจน์นี้กล่าวว่าเมื่อเปรียบเทียบวัตถุทั้งสองประเภทกับการoperator==
ให้true
แล้ววัตถุเหล่านี้จะเทียบเท่ากัน สิ่งนี้อาจดูเหมือนซ้ำซ้อน แต่ก็ไม่แน่นอน คุณสามารถกำหนดได้อย่างง่ายดายoperator==
ว่าแทนที่จะทำตัวเหมือนoperator<
ไฟล์. คุณเป็นคนชั่วที่ทำแบบนั้น แต่คุณทำได้
อีกตัวอย่างหนึ่งคือGreater
สัจพจน์ มันเป็นเรื่องที่ดีและดีที่จะพูดวัตถุสองชนิดT
สามารถนำมาเปรียบเทียบกับ>
และ<
ผู้ประกอบการ แต่สิ่งที่พวกเขาหมายถึง ? Greater
ความจริงบอกว่า IFF x
เป็นใหญ่แล้วy
จากนั้นก็จะน้อยกว่าy
x
ข้อกำหนดที่เสนอเช่นสัจพจน์มีลักษณะดังนี้:
template<typename T>
axiom Greater(T x, T y) {
(x>y) == (y<x);
}
สัจพจน์จึงตอบคำถามประเภทต่อไปนี้:
- ตัวดำเนินการทั้งสองนี้มีความสัมพันธ์ซึ่งกันและกันหรือไม่?
- ตัวดำเนินการสำหรับประเภทดังกล่าวหมายถึงสิ่งนี้หรือไม่
- การดำเนินการในประเภทนั้นมีความซับซ้อนขนาดนี้หรือไม่?
- ผลลัพธ์นี้ของตัวดำเนินการนั้นบ่งบอกว่าเป็นจริงหรือไม่?
นั่นคือพวกเขาเกี่ยวข้องอย่างสิ้นเชิงกับความหมายของประเภทและการดำเนินการเกี่ยวกับประเภทเหล่านั้น สิ่งเหล่านี้ไม่สามารถตรวจสอบแบบคงที่ได้ หากจำเป็นต้องตรวจสอบประเภทต้องประกาศในทางใดทางหนึ่งว่าเป็นไปตามความหมายเหล่านี้
ตัวอย่าง
นี่คือตัวอย่างทั่วไปของสัจพจน์:
Equivalence_relation
: ถ้าวัตถุสองชิ้นเปรียบเทียบ==
กันจะมีค่าเท่ากัน
Greater
: เมื่อใดก็ตามแล้วx > y
y < x
Less_equal
: เมื่อใดก็ตามแล้วx <= y
!(y < x)
Copy_equality
: สำหรับx
และy
ประเภทT
: if x == y
ออบเจ็กต์ใหม่ประเภทเดียวกันที่สร้างขึ้นโดยการสร้างสำเนาT{x} == y
และยังคงอยู่x == y
(นั่นคือไม่ทำลาย)
แนวคิด
ตอนนี้แนวคิดง่ายมากที่จะกำหนด พวกเขาเป็นเพียงการรวมกันของข้อ จำกัด และหลักการ พวกเขาให้ข้อกำหนดที่เป็นนามธรรมเหนือไวยากรณ์และความหมายของประเภท
ตัวอย่างเช่นพิจารณาOrdered
แนวคิดต่อไปนี้:
concept Ordered<Regular T> {
requires constraint Less<T>;
requires axiom Strict_total_order<less<T>, T>;
requires axiom Greater<T>;
requires axiom Less_equal<T>;
requires axiom Greater_equal<T>;
}
โน้ตตัวแรกที่สำหรับประเภทแม่แบบT
จะเป็นOrdered
ก็ยังต้องตอบสนองความต้องการของRegular
แนวคิด Regular
แนวคิดเป็นความต้องการขั้นพื้นฐานมากว่าประเภทที่มีความประพฤติดี - มันสามารถสร้างทำลายคัดลอกและเมื่อเทียบกับ
นอกเหนือจากข้อกำหนดเหล่านั้นข้อกำหนดOrdered
ที่เป็นT
ไปตามข้อ จำกัด หนึ่งข้อและสัจพจน์สี่ประการ:
- ข้อ จำกัด :
Ordered
ประเภทต้องมีoperator<
. สิ่งนี้ได้รับการตรวจสอบแบบคงที่ดังนั้นจึงต้องมีอยู่
- สัจพจน์: สำหรับ
x
และy
ประเภทT
:
x < y
ให้การสั่งซื้อรวมที่เข้มงวด
- เมื่อ
x
มีค่ามากกว่าy
, y
น้อยกว่าx
และในทางกลับกัน
- เมื่อ
x
มีค่าน้อยกว่าหรือเท่ากับy
, y
ไม่ได้น้อยกว่าx
และในทางกลับกัน
- เมื่อ
x
มากกว่าหรือเท่ากับy
, y
ไม่มากกว่าx
และในทางกลับกัน
การรวมข้อ จำกัด และสัจพจน์เช่นนี้ทำให้คุณมีแนวคิด พวกเขากำหนดข้อกำหนดทางวากยสัมพันธ์และความหมายสำหรับประเภทนามธรรมสำหรับใช้กับอัลกอริทึม อัลกอริทึมปัจจุบันต้องถือว่าประเภทที่ใช้จะสนับสนุนการดำเนินการบางอย่างและแสดงความหมายบางอย่าง ด้วยแนวคิดเราจะสามารถมั่นใจได้ว่าเป็นไปตามข้อกำหนด
ในการออกแบบแนวคิดล่าสุดคอมไพลเลอร์จะตรวจสอบว่าข้อกำหนดทางวากยสัมพันธ์ของแนวคิดเป็นไปตามอาร์กิวเมนต์เทมเพลตเท่านั้น สัจพจน์จะไม่ถูกเลือก เนื่องจากสัจพจน์แสดงถึงความหมายที่ไม่สามารถประเมินได้แบบคงที่ (หรือมักเป็นไปไม่ได้ที่จะตรวจสอบทั้งหมด) ผู้เขียนประเภทจะต้องระบุอย่างชัดเจนว่าประเภทของพวกเขาตรงตามข้อกำหนดทั้งหมดของแนวคิด สิ่งนี้เรียกว่าการทำแผนที่แนวคิดในการออกแบบก่อนหน้านี้ แต่ได้ถูกลบออกไป
ตัวอย่าง
นี่คือตัวอย่างบางส่วนของแนวคิด:
Regular
ประเภทสามารถสร้างได้ทำลายล้างคัดลอกได้และสามารถเปรียบเทียบได้
Ordered
ประเภทการสนับสนุนoperator<
และมีการสั่งซื้อรวมที่เข้มงวดและความหมายการสั่งซื้ออื่น ๆ
Copyable
ประเภทที่มีการคัดลอก constructable, destructable และถ้าx
มีค่าเท่ากับy
และมีการคัดลอกสำเนายังจะเปรียบเทียบเท่ากับx
y
Iterator
ประเภทต้องมีประเภทที่เกี่ยวข้องvalue_type
, reference
, difference_type
และiterator_category
ที่ตัวเองจะต้องตอบสนองแนวความคิดบางอย่าง นอกจากนี้ยังต้องสนับสนุนoperator++
และสามารถอ้างอิงได้
เส้นทางสู่แนวคิด
ข้อ จำกัด เป็นขั้นตอนแรกสู่คุณลักษณะแนวคิดทั้งหมดของ C ++ ขั้นตอนเหล่านี้เป็นขั้นตอนที่สำคัญมากเนื่องจากมีข้อกำหนดที่บังคับใช้แบบคงที่ของประเภทเพื่อให้เราสามารถเขียนฟังก์ชันเทมเพลตและคลาสที่สะอาดกว่ามาก ตอนนี้เราสามารถหลีกเลี่ยงความยากลำบากและความอัปลักษณ์ของstd::enable_if
เพื่อนร่วมโปรแกรม metaprogramming ได้แล้ว
อย่างไรก็ตามมีหลายสิ่งที่ข้อเสนอข้อ จำกัด ไม่ได้ทำ:
ไม่มีภาษานิยามแนวคิด
ข้อ จำกัด ไม่ใช่แผนผังความคิด ผู้ใช้ไม่จำเป็นต้องใส่คำอธิบายประกอบประเภทของตนโดยเฉพาะเนื่องจากเป็นไปตามข้อ จำกัด บางประการ มีการตรวจสอบแบบคงที่โดยใช้คุณสมบัติภาษาคอมไพล์ไทม์อย่างง่าย
การนำเทมเพลตไปใช้ไม่ได้ถูก จำกัด โดยข้อ จำกัด ของอาร์กิวเมนต์เทมเพลต นั่นคือถ้าเทมเพลตฟังก์ชันของคุณทำอะไรกับวัตถุประเภท จำกัด ที่ไม่ควรทำคอมไพลเลอร์จะไม่มีทางวินิจฉัยสิ่งนั้นได้ ข้อเสนอแนวคิดที่มีคุณลักษณะครบถ้วนจะสามารถทำได้
ข้อเสนอข้อ จำกัด ได้รับการออกแบบมาโดยเฉพาะเพื่อให้สามารถนำข้อเสนอแนวคิดฉบับเต็มมาใช้ ด้วยความโชคดีการเปลี่ยนแปลงนั้นควรจะเป็นไปอย่างราบรื่น กลุ่มแนวคิดต้องการแนะนำข้อ จำกัด สำหรับ C ++ 14 (หรือในรายงานทางเทคนิคหลังจากนั้นไม่นาน) ในขณะที่แนวคิดทั้งหมดอาจเริ่มปรากฏในช่วงเวลาประมาณ C ++ 17