ทบทวนเทมเพลตฟังก์ชันและคลาส
เขียนฟังก์ชันและคลาสทั่วไปด้วยไวยากรณ์เทมเพลตที่ถูกต้อง
ทบทวนเทมเพลตฟังก์ชันและคลาส เป็นบทเรียน 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); // doubletypename กับ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ทบทวนเทมเพลตฟังก์ชันและคลาส
- การทำเทมเพลตเฉพาะแบบบางส่วนและทั้งหมด
- เทมเพลตแปรผันและแพ็กพารามิเตอร์
- ฟังก์ชัน constexpr และ if constexpr