ตรรกะตามเงื่อนไข
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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การสอบถามชนิด
- การแปลงชนิด
- ตรรกะตามเงื่อนไข
- การเขียน traits แบบกำหนดเอง