ฟังก์ชัน constexpr และ if constexpr
ประเมินโค้ดขณะคอมไพล์ด้วย constexpr และแยกแขนงด้วย if constexpr
ฟังก์ชัน constexpr และ if constexpr เป็นบทเรียน C++ Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C++ Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน
การประเมินค่าขณะคอมไพล์
คีย์เวิร์ด constexpr บอกคอมไพเลอร์ว่า "ให้ประเมินค่านี้ขณะคอมไพล์เมื่อทำได้" การคำนวณขณะคอมไพล์ไม่มีต้นทุนขณะรันไทม์
ตัวแปร constexpr
ตัวแปร constexpr ต้องเริ่มต้นค่าด้วยนิพจน์ค่าคงที่ ผลลัพธ์จะถูกกำหนดตายตัวขณะคอมไพล์
constexpr int BUFFER_SIZE = 1024;
constexpr double PI = 3.14159265358979;ฟังก์ชัน constexpr
ทำเครื่องหมายฟังก์ชันด้วย constexpr เพื่อให้ฟังก์ชันเหล่านั้นทำงานขณะคอมไพล์ได้เมื่อถูกเรียกด้วยอาร์กิวเมนต์ค่าคงที่
constexpr int factorial(int n) {
return (n <= 1) ? 1 : n * factorial(n - 1);
}
constexpr int five_fact = factorial(5); // computed at compile timeทางเลือกสำรองขณะรันไทม์
ฟังก์ชัน constexpr สามารถถูกเรียกด้วยค่าขณะรันไทม์ได้เช่นกัน — ในกรณีนั้นฟังก์ชันจะทำงานขณะรันไทม์
int n = read_input();
int result = factorial(n); // runtime callข้อจำกัดของฟังก์ชัน constexpr
ก่อน C++14:
- มีคำสั่ง return ได้เพียงคำสั่งเดียว
- ไม่มีลูป
- ไม่สามารถเปลี่ยนแปลงสถานะภายในฟังก์ชันได้
C++14 ผ่อนคลายข้อจำกัดเหล่านี้ ส่วน C++17 และ C++20 เพิ่มความสามารถอื่น ๆ อีก เช่น try-catch การจัดสรรหน่วยความจำแบบไดนามิก และฟังก์ชันเสมือน
consteval (C++20)
บังคับการประเมินค่าขณะคอมไพล์ด้วย consteval การเรียกฟังก์ชัน consteval ด้วยอาร์กิวเมนต์ที่ไม่ใช่ค่าคงที่จะเป็นข้อผิดพลาด
consteval int square(int x) { return x * x; }
constexpr int c = square(5); // OK
int x = 5;
// int r = square(x); // ERRORconstinit (C++20)
constinit รับประกันว่าตัวแปรจะเริ่มต้นค่าขณะคอมไพล์ แต่ยังอนุญาตให้เปลี่ยนแปลงค่าขณะรันไทม์ได้
if constexpr (C++17)
if constexpr คือสาขาการทำงานขณะคอมไพล์ สาขาที่ไม่ได้ถูกเลือกจะไม่ถูกคอมไพล์เลย — จึงมีประโยชน์สำหรับเทมเพลต
template <typename T>
void print(const T& value) {
if constexpr (std::is_pointer_v<T>) {
std::cout << "pointer: " << *value;
} else {
std::cout << value;
}
}การเลิกใช้ SFINAE
if constexpr แทนที่รูปแบบ SFINAE ที่ซับซ้อนด้วยตรรกะแบบมีเงื่อนไขที่ชัดเจน เมื่อใช้ร่วมกับคุณลักษณะของชนิดข้อมูล จะทำให้โค้ดทั่วไปอ่านได้ง่ายขึ้นมาก
อัลกอริทึมขณะคอมไพล์
C++ สมัยใหม่ช่วยให้คุณเขียนอัลกอริทึมที่ซับซ้อนอย่างน่าประหลาดใจ ซึ่งทำงานทั้งหมดขณะคอมไพล์ได้ เช่น การแฮชสตริง การสร้างตาราง และตัวแยกวิเคราะห์ขนาดเล็ก
constexpr auto fnv1a(std::string_view s) {
uint32_t h = 2166136261u;
for (char c : s) {
h = (h ^ static_cast<uint8_t>(c)) * 16777619u;
}
return h;
}
constexpr auto x = fnv1a("hello");เทมเพลตกับ constexpr
ฟังก์ชัน constexpr ทั่วไปเป็นการผสานที่ทรงพลัง — เขียนโค้ดทั่วไปที่ยืดหยุ่นด้านชนิดข้อมูลและประเมินค่าขณะคอมไพล์ได้
การวินิจฉัยข้อผิดพลาด
ข้อผิดพลาดขณะคอมไพล์ในโค้ด constexpr จะแสดงพร้อมตำแหน่งโดยละเอียด คอมไพเลอร์สมัยใหม่ระบุตำแหน่งขั้นตอนที่ทำให้เกิดปัญหาได้ค่อนข้างดี
ตรวจสอบอย่างรวดเร็ว
if constexpr ทำสิ่งใดที่ if ปกติทำไม่ได้
สรุปทบทวน
constexpr เปิดใช้การประเมินค่าขณะคอมไพล์ ส่วน consteval บังคับให้ทำเช่นนั้น และ constinit รับประกันการเริ่มต้นค่าขณะคอมไพล์ if constexpr แยกสาขาขณะคอมไพล์ — สาขาที่ไม่ได้ถูกเลือกจะไม่ถูกสร้างอินสแตนซ์เลย จึงแทนที่ SFINAE ได้ในหลายกรณี
เรียนรู้ C++ ด้วย AI tutor — ฟรี
เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป
- คอร์ส
- 51
- บทเรียน
- 203
คำถามที่พบบ่อย
บทเรียน “ฟังก์ชัน constexpr และ if constexpr” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ฟังก์ชัน constexpr และ if constexpr” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C++ Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ฟังก์ชัน constexpr และ if constexpr”
ประเมินโค้ดขณะคอมไพล์ด้วย constexpr และแยกแขนงด้วย if constexpr คุณปฏิบัติ C++ Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C++ Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน C++ Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “ฟังก์ชัน constexpr และ if constexpr” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน C++ Academy นี้ได้ไหม
ได้ บทเรียน C++ Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ทบทวนเทมเพลตฟังก์ชันและคลาส
- การทำเทมเพลตเฉพาะแบบบางส่วนและทั้งหมด
- เทมเพลตแปรผันและแพ็กพารามิเตอร์
- ฟังก์ชัน constexpr และ if constexpr