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

การทำเทมเพลตเฉพาะแบบบางส่วนและทั้งหมด

ทำเทมเพลตเฉพาะสำหรับชนิดข้อมูลและรูปแบบพารามิเตอร์บางส่วนที่กำหนด

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

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

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