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

ฟังก์ชัน constexpr และ if constexpr

ประเมินโค้ดขณะคอมไพล์ด้วย constexpr และแยกแขนงด้วย if constexpr

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

ฟังก์ชัน 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);            // ERROR

constinit (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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. ทบทวนเทมเพลตฟังก์ชันและคลาส
  2. การทำเทมเพลตเฉพาะแบบบางส่วนและทั้งหมด
  3. เทมเพลตแปรผันและแพ็กพารามิเตอร์
  4. ฟังก์ชัน constexpr และ if constexpr
← กลับไปที่ C++ Academy