การทำเทมเพลตเฉพาะแบบบางส่วนและทั้งหมด
ทำเทมเพลตเฉพาะสำหรับชนิดข้อมูลและรูปแบบพารามิเตอร์บางส่วนที่กำหนด
การทำเทมเพลตเฉพาะแบบบางส่วนและทั้งหมด เป็นบทเรียน C++ Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C++ Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน
เมื่อรูปแบบทั่วไปไม่เพียงพอ
บางครั้งชนิดข้อมูลเฉพาะต้องการพฤติกรรมแบบกำหนดเอง การทำให้เทมเพลตเฉพาะทาง ช่วยให้คุณจัดเตรียมการทำงานที่ปรับให้เหมาะกับอาร์กิวเมนต์หนึ่งโดยเฉพาะ
การทำให้เฉพาะทางแบบเต็ม
ระบุชนิดข้อมูลที่แน่นอน แล้วจัดเตรียมการทำงานทางเลือกที่สมบูรณ์
template <typename T>
struct Printer {
void print(T x) { std::cout << x; }
};
template <>
struct Printer<bool> {
void print(bool x) { std::cout << (x ? "true" : "false"); }
};การใช้การทำให้เฉพาะทาง
คอมไพเลอร์จะเลือกการทำให้เฉพาะทางโดยอัตโนมัติเมื่อชนิดข้อมูลตรงกัน
Printer<int> pi; pi.print(42); // 42
Printer<bool> pb; pb.print(true); // trueการทำให้เทมเพลตฟังก์ชันเฉพาะทาง
คุณสามารถทำให้เทมเพลตฟังก์ชันเฉพาะทางได้เช่นกัน — แต่ควรเลือกใช้การโอเวอร์โหลดมากกว่า การโอเวอร์โหลดทำงานร่วมกับกฎการค้นหาปกติได้ดีกว่า
template <typename T> void f(T x) { /* general */ }
template <> void f<int>(int x) { /* int specific */ }เหตุผลที่ควรเลือกโอเวอร์โหลดแทนการทำให้ฟังก์ชันเฉพาะทาง
การทำให้เทมเพลตฟังก์ชันเฉพาะทางไม่ได้มีส่วนร่วมในการแก้ความกำกวมของโอเวอร์โหลดในลักษณะเดียวกัน การโอเวอร์โหลดเข้าใจได้ชัดเจนกว่า และช่วยหลีกเลี่ยงกับดักที่ว่า "ทำไมจึงไม่เรียกใช้การทำให้เฉพาะทางของฉัน"
การทำให้เฉพาะทางแบบบางส่วน (เฉพาะคลาส)
การทำให้เฉพาะทางแบบบางส่วนช่วยให้คุณปรับการทำงานสำหรับ หมวดหมู่ ของชนิดข้อมูล เช่น พอยน์เตอร์ การอ้างอิง หรือคอนเทนเนอร์ใด ๆ
template <typename T>
struct Type { static const char* name() { return "general"; } };
template <typename T>
struct Type<T*> { static const char* name() { return "pointer"; } };
template <typename T>
struct Type<std::vector<T>> { static const char* name() { return "vector"; } };กรณีใช้งานการทำให้เฉพาะทางแบบบางส่วน
สถานการณ์ที่พบบ่อย:
- พฤติกรรมที่แตกต่างกันสำหรับชนิดพอยน์เตอร์
- เวอร์ชันที่ปรับประสิทธิภาพสำหรับชนิดข้อมูลที่คัดลอกได้โดยตรง
- การแทนที่การทำงานเฉพาะสำหรับคอนเทนเนอร์
การทำให้เทมเพลตของ std เฉพาะทาง
คุณสามารถทำให้เทมเพลตในเนมสเปซ std เฉพาะทางได้ (ภายใต้ข้อจำกัด) — โดยทั่วไปมักใช้กับ std::hash สำหรับชนิดข้อมูลที่ผู้ใช้กำหนด เพื่อให้ชนิดข้อมูลเหล่านั้นอยู่ใน std::unordered_map ได้
template <>
struct std::hash<MyType> {
size_t operator()(const MyType& v) const {
return /* compute hash */;
}
};ควรใช้การทำให้เฉพาะทางเมื่อใด
ใช้การทำให้เฉพาะทางเมื่อ:
- ชนิดข้อมูลต้องการพฤติกรรมที่แตกต่างโดยพื้นฐาน
- คุณต้องการเส้นทางการทำงานที่ปรับประสิทธิภาพสำหรับชนิดข้อมูลที่ทราบแน่ชัด
- คุณกำลังผสานรวมกับไลบรารีทั่วไปที่ใช้คุณลักษณะของชนิดข้อมูล
ทางเลือกใน C++ สมัยใหม่
C++17 เพิ่ม if constexpr และ C++20 เพิ่มแนวคิด ทั้งสองอย่างมักช่วยแทนที่การทำให้เฉพาะทางด้วยโค้ดที่สะอาดกว่า
template <typename T>
void print(const T& x) {
if constexpr (std::is_same_v<T, bool>) {
std::cout << (x ? "true" : "false");
} else {
std::cout << x;
}
}ลำดับชั้นของการทำให้เฉพาะทาง
เมื่อมีการทำให้เฉพาะทางหลายแบบที่สามารถใช้ได้ แบบที่เฉพาะเจาะจงที่สุดจะเป็นผู้ชนะ คอมไพเลอร์จะเลือกอย่างไม่มีความกำกวม หรือไม่ก็แจ้งข้อผิดพลาด
ข้อผิดพลาดที่พบบ่อย
ข้อผิดพลาดหลักมีสองประการ:
- ลืมใส่
template <>ในการทำให้เฉพาะทางแบบเต็ม - ใส่การทำให้เฉพาะทางไว้ในไฟล์ส่วนหัวโดยไม่มี inline ซึ่งนำไปสู่การละเมิด ODR
ตรวจสอบอย่างรวดเร็ว
การทำให้เฉพาะทางประเภทใดที่ ไม่ อนุญาตโดยตรงสำหรับเทมเพลตฟังก์ชัน
สรุปทบทวน
การทำให้เทมเพลตเฉพาะทางจัดเตรียมการทำงานเฉพาะชนิดข้อมูล การทำให้เฉพาะทางแบบเต็มกำหนดพารามิเตอร์ทั้งหมดตายตัว ส่วนการทำให้เฉพาะทางแบบบางส่วน (เฉพาะเทมเพลตคลาส) จะปรับการทำงานสำหรับหมวดหมู่ต่าง ๆ ทางเลือกสมัยใหม่อย่าง if constexpr และแนวคิดมักสร้างโค้ดที่สะอาดกว่า
คำถามที่พบบ่อย
บทเรียน “การทำเทมเพลตเฉพาะแบบบางส่วนและทั้งหมด” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การทำเทมเพลตเฉพาะแบบบางส่วนและทั้งหมด” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C++ Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การทำเทมเพลตเฉพาะแบบบางส่วนและทั้งหมด”
ทำเทมเพลตเฉพาะสำหรับชนิดข้อมูลและรูปแบบพารามิเตอร์บางส่วนที่กำหนด คุณปฏิบัติ C++ Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C++ Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน C++ Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “การทำเทมเพลตเฉพาะแบบบางส่วนและทั้งหมด” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน C++ Academy นี้ได้ไหม
ได้ บทเรียน C++ Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ทบทวนเทมเพลตฟังก์ชันและคลาส
- การทำเทมเพลตเฉพาะแบบบางส่วนและทั้งหมด
- เทมเพลตแปรผันและแพ็กพารามิเตอร์
- ฟังก์ชัน constexpr และ if constexpr