การใช้ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- เหตุใดจึงใช้ Concepts แทน SFINAE
- การกำหนด Concepts ด้วย requires
- การใช้ Concepts ในเทมเพลตและ auto
- Concepts มาตรฐานที่ใช้บ่อย: Integral และ Ranges