C++ Academy · บทเรียน

การกำหนด Concepts ด้วย requires

กำหนด concepts แบบกำหนดเองด้วยนิพจน์ requires และข้อจำกัด

บทเรียน 2 จาก 414 ขั้นตอน

การกำหนด Concepts ด้วย requires เป็นบทเรียน C++ Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C++ Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน

คีย์เวิร์ด concept

ประกาศแนวคิดด้วย template <params> concept Name = expression; นิพจน์ต้องเป็นค่าบูลีนขณะคอมไพล์

template <typename T>
concept Integer = std::is_integral_v<T>;

การผสานคุณลักษณะชนิด

ใช้ตัวดำเนินการเชิงตรรกะเพื่อผสานคุณลักษณะชนิดให้เป็นแนวคิด

template <typename T>
concept SignedInteger = std::is_integral_v<T> && std::is_signed_v<T>;

นิพจน์ requires

รูปแบบที่สื่อความหมายได้มากขึ้น: ระบุการดำเนินการที่ชนิดต้องรองรับ

template <typename T>
concept Addable = requires(T a, T b) {
    a + b;
};

ข้อกำหนดแบบผสม

ภายใน requires คุณสามารถระบุชนิดผลลัพธ์และข้อจำกัดเพิ่มเติมได้

template <typename T>
concept Number = requires(T a, T b) {
    { a + b } -> std::convertible_to<T>;
    { a * b } -> std::convertible_to<T>;
};

ข้อกำหนดแบบซ้อน

เพิ่ม requires ภายในนิพจน์ requires เพื่อนำแนวคิดที่มีชื่อมาใช้

template <typename T>
concept Sortable = requires(T t) {
    { t.begin() };
    { t.end() };
    requires std::movable<typename T::value_type>;
};

ข้อกำหนดชนิด

คุณสามารถกำหนดให้ชนิดมีชนิดซ้อนหรือนามแฝงบางอย่างได้

template <typename T>
concept HasValueType = requires {
    typename T::value_type;
};

การใช้แนวคิดในแม่แบบ

ไวยากรณ์สามรูปแบบ:

// 1. Replace typename
template <Integer T>
T increment(T x) { return x + 1; }

// 2. requires after template parameters
template <typename T>
    requires Integer<T>
T increment(T x) { return x + 1; }

// 3. requires after function signature
template <typename T>
T increment(T x) requires Integer<T> {
    return x + 1;
}

แนวคิดกับพารามิเตอร์ auto

แม่แบบฟังก์ชันแบบย่อก็สามารถกำหนดข้อจำกัดได้เช่นกัน

void process(Integer auto x) { std::cout << x; }

ข้อจำกัดหลายรายการ

ผสานแนวคิดด้วย && และ ||

template <std::integral T, std::integral U>
    requires (sizeof(T) >= sizeof(U))
T promote(U value) { return static_cast<T>(value); }

รูปแบบการตั้งชื่อ

โค้ดส่วนใหญ่มักใช้ CamelCase กับแนวคิด ไลบรารีบางแห่งใช้ตัวพิมพ์เล็ก ซึ่งสอดคล้องกับไลบรารีมาตรฐาน โปรดเลือกรูปแบบหนึ่งและใช้ให้สม่ำเสมอ

แนวคิดในแม่แบบคลาส

กำหนดข้อจำกัดให้แม่แบบคลาสด้วยวิธีเดียวกัน

template <std::integral T>
class Counter { T value_; /* ... */ };

แนวคิดที่นำกลับมาใช้ใหม่ได้

กำหนดไลบรารีของแนวคิดขนาดเล็ก แล้วนำมาประกอบกัน แนวคิดที่นำกลับมาใช้ใหม่ได้ช่วยให้แม่แบบอธิบายตัวเองได้และดูแลรักษาได้ง่าย

ตรวจสอบอย่างรวดเร็ว

ไวยากรณ์ใดภายในนิพจน์ requires ที่ตรวจสอบว่าผลลัพธ์ของ a + b สามารถแปลงเป็น T ได้

สรุปทบทวน

กำหนดแนวคิดด้วย concept Name = expression ใช้นิพจน์ requires สำหรับข้อจำกัดที่อิงการดำเนินการ โดยใช้ข้อกำหนดแบบผสม แบบซ้อน และข้อกำหนดชนิด ผสานแนวคิดด้วย && และ || เพื่อแสดงข้อจำกัดที่มีรายละเอียดครบถ้วน

เริ่มต้นได้ฟรี

เรียนรู้ C++ ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
51
บทเรียน
203

คำถามที่พบบ่อย

บทเรียน “การกำหนด Concepts ด้วย requires” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การกำหนด Concepts ด้วย requires” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C++ Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การกำหนด Concepts ด้วย requires”

กำหนด concepts แบบกำหนดเองด้วยนิพจน์ requires และข้อจำกัด คุณปฏิบัติ C++ Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C++ Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน C++ Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “การกำหนด Concepts ด้วย requires” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C++ Academy นี้ได้ไหม

ได้ บทเรียน C++ Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. เหตุใดจึงใช้ Concepts แทน SFINAE
  2. การกำหนด Concepts ด้วย requires
  3. การใช้ Concepts ในเทมเพลตและ auto
  4. Concepts มาตรฐานที่ใช้บ่อย: Integral และ Ranges
← กลับไปที่ C++ Academy