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

ตรรกะตามเงื่อนไข

std::conditional และ if constexpr

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

การเลือกประเภทและสาขาการทำงาน

ตรรกะของคุณลักษณะประเภทช่วยให้โค้ดเลือกประเภทและเส้นทางการทำงานขณะคอมไพล์ เครื่องมือสำคัญคือ std::conditional และ if constexpr

การเลือกแบบมีเงื่อนไข

std::conditional_t<cond, A, B> จะประเมินเป็น A เมื่อ cond เป็นจริง และเป็น B ในกรณีอื่น

#include <iostream>
#include <type_traits>

int main() {
    using T = std::conditional_t<true, int, double>;
    std::cout << std::is_same_v<T, int> << "\n";
    return 0;
}

การเลือกประเภทสำหรับจัดเก็บ

การใช้งานทั่วไปอย่างหนึ่งคือเลือกประเภทขนาดกว้างสำหรับค่าขนาดใหญ่ และเลือกประเภทขนาดแคบในกรณีอื่น

#include <iostream>
#include <type_traits>

template <bool Big>
struct Storage {
    using type = std::conditional_t<Big, long long, short>;
};

int main() {
    Storage<true>::type a = 10;
    std::cout << sizeof(a) << "\n";
    return 0;
}

พื้นฐานของ if constexpr

if constexpr (C++17) จะละทิ้งแขนงที่ไม่ได้เลือกตั้งแต่เวลาคอมไพล์ โดยต้องคอมไพล์ได้เฉพาะแขนงที่เลือกสำหรับชนิดนั้นเท่านั้น

#include <iostream>
#include <type_traits>

template <typename T>
void describe(T v) {
    if constexpr (std::is_integral_v<T>)
        std::cout << "integer: " << v << "\n";
    else
        std::cout << "other: " << v << "\n";
}

int main() {
    describe(5);
    describe(2.5);
    return 0;
}

เหตุใด if constexpr จึงดีกว่า if ขณะทำงาน

สำหรับ if ทั่วไป แขนงทั้งสองต้องคอมไพล์ได้สำหรับ T ทุกชนิด แต่สำหรับ if constexpr แขนงที่ถูกปฏิเสธจะไม่ถูกสร้างอินสแตนซ์ จึงสามารถมีโค้ดเฉพาะชนิดที่ไม่ถูกต้องในกรณีอื่นได้

การดำเนินการเฉพาะชนิด

ไม่สามารถทำเช่นนี้ด้วย if ธรรมดาได้ เนื่องจาก .length() จะคอมไพล์ไม่ผ่านสำหรับ int

#include <iostream>
#include <string>
#include <type_traits>

template <typename T>
auto size_of(const T& v) {
    if constexpr (std::is_same_v<T, std::string>)
        return v.length();
    else
        return sizeof(v);
}

int main() {
    std::cout << size_of(std::string("hi")) << "\n";
    std::cout << size_of(42) << "\n";
    return 0;
}

enable_if สำหรับโอเวอร์โหลด

ก่อนมี if constexpr นั้น std::enable_if ใช้เลือกโอเวอร์โหลดผ่าน SFINAE โดยจะนำฟังก์ชันออกจากการพิจารณาโอเวอร์โหลดเมื่อเงื่อนไขเป็นเท็จ

#include <iostream>
#include <type_traits>

template <typename T, std::enable_if_t<std::is_integral_v<T>, int> = 0>
void only_int(T v) { std::cout << "int " << v << "\n"; }

int main() {
    only_int(7);
    return 0;
}

การรวมเงื่อนไข

คุณสามารถรวมคุณลักษณะด้วย &&, || และ ! ในเงื่อนไขขณะคอมไพล์ได้เช่นเดียวกับค่าบูลีนทั่วไป

#include <iostream>
#include <type_traits>

template <typename T>
void check() {
    if constexpr (std::is_integral_v<T> && !std::is_same_v<T, bool>)
        std::cout << "non-bool integer\n";
    else
        std::cout << "something else\n";
}

int main() {
    check<int>();
    check<bool>();
    return 0;
}

การเลือกแบบเวียนเกิดขณะคอมไพล์

if constexpr ทำให้เกิดการเรียกเวียนเกิดขณะคอมไพล์ได้ ซึ่งมีประโยชน์สำหรับประมวลผลทูเพิลหรือชุดพารามิเตอร์ทีละสมาชิก

conjunction และ disjunction

C++17 ยังมี std::conjunction และ std::disjunction สำหรับดำเนินการ AND/OR เชิงตรรกะแบบลัดวงจรกับรายการคุณลักษณะ

การเลือกเครื่องมือที่เหมาะสม

ใช้ conditional เพื่อเลือกชนิด ใช้ if constexpr เพื่อเลือกโค้ด และใช้ enable_if/คอนเซ็ปต์เพื่อควบคุมการพิจารณาโอเวอร์โหลด โค้ดสมัยใหม่มักเลือกใช้ if constexpr และคอนเซ็ปต์เพื่อให้เข้าใจได้ชัดเจน

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

ทบทวนประโยชน์สำคัญของ if constexpr

สรุปทบทวน

คุณได้เรียนรู้ตรรกะเงื่อนไขขณะคอมไพล์

  • conditional_t<c,A,B> ใช้เลือกชนิด
  • if constexpr ใช้เลือกโค้ดและละทิ้งอีกแขนงหนึ่ง
  • enable_if ควบคุมการพิจารณาโอเวอร์โหลดผ่าน SFINAE
  • รวมคุณลักษณะด้วยตัวดำเนินการเชิงตรรกะ

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

บทเรียน “ตรรกะตามเงื่อนไข” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “ตรรกะตามเงื่อนไข”

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

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

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

บทเรียน “ตรรกะตามเงื่อนไข” ใช้เวลานานแค่ไหน

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

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

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

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

  1. การสอบถามชนิด
  2. การแปลงชนิด
  3. ตรรกะตามเงื่อนไข
  4. การเขียน traits แบบกำหนดเอง
← กลับไปที่ C++ Academy