คำถามติดแท็ก c++-concepts

5
ทำไมเราต้องมีความต้องการ?
หนึ่งในมุมของ C ++ 20 requires requiresแนวคิดก็คือว่ามีบางสถานการณ์ที่คุณต้องเขียน ตัวอย่างเช่นตัวอย่างนี้จาก[expr.prim.req] / 3 : ต้องแสดงออกนอกจากนี้ยังสามารถนำมาใช้ในต้องมีข้อ ([ชั่วคราว]) เป็นวิธีการเขียนโฆษณา จำกัด เฉพาะกิจข้อโต้แย้งแม่แบบดังกล่าวเป็นหนึ่งด้านล่าง: template<typename T> requires requires (T x) { x + x; } T add(T a, T b) { return a + b; } เป็นครั้งแรกที่ต้องเปิดต้องใช้ข้อและแนะนำที่สองต้องแสดงออก เหตุผลทางเทคนิคที่อยู่เบื้องหลังrequiresคำหลักที่ต้องการนั้นคืออะไร ทำไมเราไม่อนุญาตให้เขียน: template<typename T> requires (T x) { x + x; } …
161 c++  c++-concepts  c++20 

3
อะไรคือความแตกต่างระหว่างแนวคิดและข้อ จำกัด ของเทมเพลต
ฉันต้องการทราบว่าอะไรคือความแตกต่างทางความหมายระหว่างข้อเสนอแนวคิดเต็มรูปแบบ C ++ และข้อ จำกัด ของเทมเพลต (ตัวอย่างเช่นข้อ จำกัด ที่ปรากฏใน Dlang หรือ ข้อเสนอแนวคิดใหม่สำหรับ C ++ 1y ) แนวคิดที่สมบูรณ์สามารถทำอะไรได้มากกว่าข้อ จำกัด ของเทมเพลตที่ไม่สามารถทำได้
96 c++  c++11  d  c++-concepts 

3
C ++ 20 Concepts: ความเชี่ยวชาญเทมเพลตใดที่ได้รับเลือกเมื่ออาร์กิวเมนต์เทมเพลตนั้นมีคุณสมบัติเหมาะสมสำหรับหลายแนวคิด
ให้: #include <concepts> #include <iostream> template<class T> struct wrapper; template<std::signed_integral T> struct wrapper<T> { wrapper() = default; void print() { std::cout << "signed_integral" << std::endl; } }; template<std::integral T> struct wrapper<T> { wrapper() = default; void print() { std::cout << "integral" << std::endl; } }; int main() { wrapper<int> w; …

1
`equality_comparable_with` จำเป็นต้องใช้` common_reference` หรือไม่?
แนวคิดequality_­comparable_with<T, U>มีจุดมุ่งหมายที่จะประกาศวัตถุชนิดที่TและUสามารถนำมาเปรียบเทียบเท่ากับแต่ละอื่น ๆ และถ้าพวกเขาอยู่แล้วนี้มีความหมายที่คาดหวัง ไม่เป็นไร. อย่างไรก็ตามแนวคิดนี้ยังต้องcommon_reference_t<T&, U&>มีอยู่ แรงกระตุ้นหลักสำหรับcommon_referenceและฟังก์ชั่นการดูแลของมันดูเหมือนว่าจะเปิดใช้งานตัวทำซ้ำพร็อกซีเพื่อให้มีสถานที่ที่จะเป็นตัวแทนของความสัมพันธ์ระหว่างreferenceและvalue_typeสำหรับการทำซ้ำดังกล่าว เยี่ยมมาก แต่ ... สิ่งใดที่เกี่ยวข้องกับการทดสอบว่า a Tและ a Uสามารถเปรียบเทียบกันได้หรือไม่ ทำไมมาตรฐานจึงต้องการสิ่งนั้นTและUมีความสัมพันธ์อ้างอิงร่วมกันเพียงเพื่อให้คุณสามารถเปรียบเทียบพวกเขาได้เท่ากัน? สิ่งนี้จะสร้างสถานการณ์คี่บอลซึ่งเป็นการยากมากที่จะมีสองประเภทซึ่งไม่มีเหตุผลพอสมควรที่มีความสัมพันธ์อ้างอิงทั่วไปที่เทียบเคียงได้ในเชิงตรรกะ ตัวอย่างเช่นvector<int>และpmr::vector<int>เหตุผลควรเปรียบเทียบ แต่ไม่สามารถทำได้เพราะไม่มีการอ้างอิงทั่วไปที่สมเหตุสมผลระหว่างสองประเภทที่ไม่เกี่ยวข้องกัน

1
การตรวจสอบแนวคิด TS ไม่สนใจตัวแก้ไขการเข้าถึงส่วนตัว
ฉันต้องการเขียนแนวคิดที่สามารถจัดทำดัชนีความหมายว่าลำดับที่มีเริ่มต้น / สิ้นสุดที่ส่งกลับ RandomAccessIterator หรือผู้ประกอบการ [] ถูกกำหนดและส่งกลับค่าประเภทที่ไม่เป็นโมฆะ ฉันใช้แนวคิดจากบทความของ Stroustrupสำหรับแนวคิด Sequence และเติมด้วย: template <class T> concept bool Indexable = Sequence<T> || requires(T t, size_t n) { { t[n] } -> NotVoid; }; สามารถใช้งานได้ในกรณีส่วนใหญ่ แต่ล้มเหลวในกรณีต่อไปนี้ struct Bad { std::vector<int> nums; private: int& operator[](size_t ind) { return nums[ind]; } }; static_assert(!Indexable<Bad>, "fail"); ด้วยเหตุผลบางอย่างที่คอนเซ็ปต์ของฉันเพิกเฉยต่อความจริงที่ว่าตัวดำเนินการ …
10 c++  c++-concepts 

1
ต้องใช้นิพจน์ที่ได้รับอนุญาตในการ "จับ" ตัวแปรของขอบเขตการล้อมรอบหรือไม่
ในตัวอย่างต่อไปนี้อาร์กิวเมนต์ของฟังก์ชันถูกใช้เพื่อทดสอบด้วยนิพจน์ที่ต้องการว่านิพจน์ที่ใช้พวกเขานั้นมีรูปแบบที่ดีหรือไม่ การแสดงออกต้องไม่มีการโต้แย้ง; มันใช้ตัวแปรในขอบเขตฟังก์ชั่นโดยตรง: #include <cstddef> #include <vector> template<typename T> void Resize(T &v, std::size_t const n) { if constexpr (requires { v.resize(n); }) v.resize(n); } template<typename T> void Eziser(T &v, std::size_t const n) { if constexpr (requires { v.eziser(n); }) v.eziser(n); } int main() { std::vector<int> v; Resize(v, 10u); Eziser(v, 10u); …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.