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

การใช้ Concepts ในเทมเพลตและ auto

กำหนดข้อจำกัดให้เทมเพลตฟังก์ชันและเทมเพลตฟังก์ชันแบบย่อด้วย concepts

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

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

คุณสามารถใช้แนวคิดได้สามวิธี ได้แก่ เป็นคำนำหน้าพารามิเตอร์แม่แบบ เป็นส่วนคำสั่ง requires หรือใช้ไวยากรณ์แม่แบบฟังก์ชันแบบย่อ

ไวยากรณ์แบบคำนำหน้า

แทนที่ typename ด้วยชื่อแนวคิด

template <std::integral T>
T add(T a, T b) { return a + b; }

ไวยากรณ์ส่วนคำสั่ง requires

เพิ่ม requires หลังรายการพารามิเตอร์แม่แบบ ยืดหยุ่นที่สุดและรองรับเงื่อนไขที่ซับซ้อน

template <typename T>
    requires std::integral<T> || std::floating_point<T>
T add(T a, T b) { return a + b; }

ส่วนคำสั่ง requires ต่อท้าย

วาง requires หลังลายเซ็นฟังก์ชัน เหมาะสำหรับฟังก์ชันสมาชิกที่ข้อจำกัดขึ้นอยู่กับพารามิเตอร์

template <typename T>
class Container {
public:
    void sort() requires std::sortable<T> { /* ... */ }
};

แม่แบบฟังก์ชันแบบย่อ

ใช้ auto ในพารามิเตอร์และกำหนดข้อจำกัดให้กับพารามิเตอร์นั้น คอมไพเลอร์จะสร้างแม่แบบขึ้นเบื้องหลัง

void greet(std::convertible_to<std::string> auto name) {
    std::cout << "Hello " << name;
}

พารามิเตอร์ auto หลายรายการ

แต่ละ auto สามารถมีแนวคิดของตนเองได้ แต่ละ auto จะสร้างพารามิเตอร์แม่แบบที่เป็นอิสระต่อกัน

auto multiply(std::integral auto a, std::integral auto b) {
    return a * b;
}

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

ใช้ไวยากรณ์สามรูปแบบเดียวกัน

template <std::movable T>
class Buffer { /* ... */ };

template <typename T>
    requires std::default_initializable<T>
class Storage { /* ... */ };

แลมบ์ดาที่มีข้อจำกัด (C++20)

แลมบ์ดาสามารถมีพารามิเตอร์แม่แบบแบบระบุชัดเจนที่ใช้แนวคิดได้

auto print = []<std::integral T>(T x) {
    std::cout << x << " is integral";
};
print(42);

การเลือกโอเวอร์โหลดโดยใช้แนวคิด

คอมไพเลอร์จะเลือกโอเวอร์โหลดที่มีข้อจำกัดมากที่สุดจากรายการที่ตรงกัน แนวคิดที่เฉพาะเจาะจงกว่าจะมีลำดับเหนือแนวคิดที่เฉพาะเจาะจงน้อยกว่า

void process(std::integral auto x)       { std::cout << "int\n"; }
void process(std::signed_integral auto x) { std::cout << "signed\n"; }

process(42);    // calls signed_integral version

ฟังก์ชันสมาชิกที่มีข้อจำกัด

สมาชิกของแม่แบบคลาสสามารถมีข้อจำกัดของตนเองได้

template <typename T>
class Optional {
    T value_;
public:
    void clear() requires std::is_trivially_destructible_v<T> { /* fast */ }
    void clear() { /* general */ }
};

ชนิดที่มีข้อจำกัดและค่าเริ่มต้น

ผสาน requires กับค่าเริ่มต้นเพื่อเขียนแม่แบบที่สะอาดและสื่อเจตนาได้ชัดเจน

แนวทางการเขียน

ใช้ไวยากรณ์แบบคำนำหน้าสำหรับกรณีทั่วไป เปลี่ยนไปใช้ requires เมื่อข้อจำกัดซับซ้อนหรือเกี่ยวข้องกับหลายชนิด ใช้แม่แบบฟังก์ชันแบบย่อสำหรับฟังก์ชันสั้นที่มีจุดประสงค์ชัดเจน

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

ไวยากรณ์แม่แบบฟังก์ชันแบบย่อสำหรับ "ฟังก์ชันที่รับค่าจำนวนเต็มใด ๆ" คืออะไร

สรุปทบทวน

ใช้แนวคิดเป็นคำนำหน้า ในส่วนคำสั่ง requires หรือในแม่แบบฟังก์ชันแบบย่อ โอเวอร์โหลดที่ตรงกันและมีข้อจำกัดมากที่สุดจะเป็นผู้ชนะ ใช้ไวยากรณ์ที่สะอาดที่สุดและเหมาะกับงาน: คำนำหน้าสำหรับกรณีง่าย requires สำหรับกรณีซับซ้อน และแบบย่อสำหรับฟังก์ชันสั้น

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

บทเรียน “การใช้ Concepts ในเทมเพลตและ auto” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “การใช้ Concepts ในเทมเพลตและ auto”

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

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

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

บทเรียน “การใช้ Concepts ในเทมเพลตและ auto” ใช้เวลานานแค่ไหน

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

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

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

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

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