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

ทบทวนเทมเพลตฟังก์ชันและคลาส

เขียนฟังก์ชันและคลาสทั่วไปด้วยไวยากรณ์เทมเพลตที่ถูกต้อง

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

ทำไมต้องใช้เทมเพลต

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

ไวยากรณ์ของเทมเพลตฟังก์ชัน

ประกาศพารามิเตอร์ชนิดข้อมูลด้วย template <typename T> แล้วใช้ T ในลายเซ็นของฟังก์ชัน

template <typename T>
T max_of(T a, T b) {
    return (a > b) ? a : b;
}

std::cout << max_of(3, 7);          // int
std::cout << max_of(2.5, 1.5);      // double

typename กับ class

คำสำคัญ typename และ class ใช้แทนกันได้ในการประกาศพารามิเตอร์ของเทมเพลต โดยทั่วไปสไตล์สมัยใหม่นิยมใช้ typename มากกว่า

พารามิเตอร์ชนิดข้อมูลหลายตัว

เทมเพลตสามารถมีพารามิเตอร์ชนิดข้อมูลหลายตัวได้

template <typename T, typename U>
auto combine(T a, U b) -> decltype(a + b) {
    return a + b;
}

พารามิเตอร์ที่ไม่ใช่ชนิดข้อมูล

พารามิเตอร์ของเทมเพลตอาจเป็นค่าที่ไม่ใช่ชนิดข้อมูลได้ด้วย เช่น จำนวนเต็ม ค่าแจกแจง และพอยน์เตอร์

template <typename T, size_t N>
struct StaticArray {
    T data[N];
};

StaticArray<int, 10> arr;

เทมเพลตคลาส

คลาสทั่วไปใช้ไวยากรณ์เทมเพลตแบบเดียวกัน ใช้พารามิเตอร์ชนิดข้อมูลกับสมาชิกและเมธอด

template <typename T>
class Stack {
    std::vector<T> data_;
public:
    void push(T x) { data_.push_back(std::move(x)); }
    T pop()        { T t = std::move(data_.back()); data_.pop_back(); return t; }
};

Stack<int> s1;
Stack<std::string> s2;

ฟังก์ชันสมาชิกภายนอกคลาส

การนิยามภายนอกคลาสต้องมีคำนำหน้าเทมเพลตสำหรับสมาชิกทุกตัว

template <typename T>
class Stack {
public:
    void push(T x);
};

template <typename T>
void Stack<T>::push(T x) {
    data_.push_back(std::move(x));
}

อาร์กิวเมนต์เริ่มต้นของเทมเพลต

เช่นเดียวกับอาร์กิวเมนต์เริ่มต้นของฟังก์ชัน ระบบจะใช้ค่าเหล่านี้เมื่อผู้เรียกไม่ได้ระบุ

template <typename T = int>
class Box {
    T value;
};

Box<> b;       // T is int

การอนุมานอาร์กิวเมนต์ของเทมเพลต

คอมไพเลอร์มักอนุมานอาร์กิวเมนต์ของเทมเพลตจากการเรียกใช้

template <typename T>
void print(T x) { std::cout << x; }

print(42);          // T deduced as int
print("hello");    // T deduced as const char*
print<double>(3);   // explicit

การอนุมานอาร์กิวเมนต์ของเทมเพลตคลาส (C++17)

C++17 อนุญาตให้ละเว้นอาร์กิวเมนต์ของเทมเพลตคลาสได้ เมื่อสามารถอนุมานอาร์กิวเมนต์เหล่านั้นจากตัวสร้าง

std::pair p(1, 2.5);            // pair<int, double>
std::vector v{1, 2, 3};         // vector<int>

การค้นหาสองระยะ

เทมเพลตจะค้นหาชื่อเป็นสองระยะ — ในระยะการนิยาม (ชื่อที่ไม่ขึ้นต่อกัน) และระยะการสร้างอินสแตนซ์ (ชื่อที่ขึ้นต่อกัน) วิธีนี้ช่วยตรวจพบข้อผิดพลาดจำนวนมากตั้งแต่เวลานิยาม

ข้อความข้อผิดพลาด

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

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

คุณลักษณะใดทำให้ std::vector v{1, 2, 3}; คอมไพล์ได้โดยไม่ต้องระบุ std::vector<int>

สรุปทบทวน

เทมเพลตสร้างโค้ดเฉพาะชนิดข้อมูลในเวลาคอมไพล์ กำหนดเทมเพลตฟังก์ชันและเทมเพลตคลาสด้วย template <typename T> คอมไพเลอร์จะอนุมานอาร์กิวเมนต์เมื่อทำได้ — หากจำเป็นให้ระบุอย่างชัดเจน

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

บทเรียน “ทบทวนเทมเพลตฟังก์ชันและคลาส” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “ทบทวนเทมเพลตฟังก์ชันและคลาส”

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

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

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

บทเรียน “ทบทวนเทมเพลตฟังก์ชันและคลาส” ใช้เวลานานแค่ไหน

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

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

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

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

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