เทมเพลตแปรผันและแพ็กพารามิเตอร์
ใช้แพ็กพารามิเตอร์และนิพจน์พับเพื่อเขียนเทมเพลตแปรผัน
เทมเพลตแปรผันและแพ็กพารามิเตอร์ เป็นบทเรียน C++ Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C++ Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน
จำนวนอาร์กิวเมนต์เทมเพลตที่เปลี่ยนแปลงได้
เทมเพลตแบบหลายอาร์กิวเมนต์ รองรับอาร์กิวเมนต์ของเทมเพลตจำนวนเท่าใดก็ได้ ใช้สำหรับเขียนฟังก์ชันอย่าง std::make_unique, std::tuple และการบันทึกข้อมูลรูปแบบการพิมพ์ผล
ไวยากรณ์ของแพ็กพารามิเตอร์
ใช้ typename... Ts เพื่อประกาศแพ็กพารามิเตอร์ชนิดข้อมูล และใช้ Ts... เพื่อขยายแพ็ก
template <typename... Args>
void print_all(Args... args) {
// ...
}การขยายแพ็ก
... ที่อยู่หลังนิพจน์จะขยายแพ็กออกเป็นรายการที่คั่นด้วยจุลภาค
template <typename... Args>
void pass_through(Args... args) {
other_func(args...); // pass each arg
}เทมเพลตแบบหลายอาร์กิวเมนต์ที่เรียกซ้ำ (รูปแบบเก่า)
ก่อน C++17 ฟังก์ชันแบบหลายอาร์กิวเมนต์มักเขียนโดยใช้การเรียกซ้ำ — ประมวลผลอาร์กิวเมนต์หนึ่งตัว แล้วเรียกซ้ำด้วยอาร์กิวเมนต์ที่เหลือ
// base case
void log() {}
// recursive case
template <typename T, typename... Rest>
void log(T first, Rest... rest) {
std::cout << first;
log(rest...);
}นิพจน์การพับ (C++17)
C++17 เพิ่ม นิพจน์การพับ ซึ่งสะอาดกว่าการเรียกซ้ำมาก ใช้ตัวดำเนินการกับแพ็ก
template <typename... Args>
auto sum(Args... args) {
return (args + ...); // fold +
}
std::cout << sum(1, 2, 3, 4); // 10ตัวดำเนินการสำหรับการพับ
รูปแบบการพับมีสี่แบบ:
(... op pack)— การพับจากซ้ายผ่านการขยายแบบเอกฐาน(pack op ...)— การพับจากขวา(init op ... op pack)— การพับจากซ้ายโดยมีค่าเริ่มต้น(pack op ... op init)— การพับจากขวาโดยมีค่าเริ่มต้น
การพิมพ์อาร์กิวเมนต์ทั้งหมด
เป็นรูปแบบการใช้งานที่พบบ่อยร่วมกับการพับด้วยจุลภาค
template <typename... Args>
void print_all(Args... args) {
((std::cout << args << " "), ...); // comma fold
}
print_all(1, "hi", 3.14); // 1 hi 3.14การนับอาร์กิวเมนต์
sizeof...(pack) คืนค่าจำนวนรายการในแพ็กขณะคอมไพล์
template <typename... Args>
void info(Args... args) {
std::cout << "count = " << sizeof...(args);
}เทมเพลตคลาสแบบหลายอาร์กิวเมนต์
เทมเพลตคลาสสามารถมีแพ็กพารามิเตอร์ได้เช่นกัน ตัวอย่างเช่น std::tuple<Ts...>
template <typename... Ts>
class Tuple {
// implementation uses recursion or storage tricks
};การส่งต่ออย่างสมบูรณ์ด้วยแพ็ก
ผสานเทมเพลตแบบหลายอาร์กิวเมนต์เข้ากับ std::forward เพื่อส่งต่ออาร์กิวเมนต์ใด ๆ ไปยังตัวสร้างได้อย่างสมบูรณ์
template <typename T, typename... Args>
std::unique_ptr<T> my_make_unique(Args&&... args) {
return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}การจัดการแพ็กชนิดข้อมูล
ด้วยการทำให้เทมเพลตเฉพาะทางหรือนิพจน์การพับ คุณสามารถใช้การดำเนินการกับรายการขณะคอมไพล์ได้ เช่น การหาสมาชิกแรก สมาชิกสุดท้าย และการแยกส่วนหัวกับส่วนหาง
ข้อผิดพลาดที่ควรระวัง
ปัญหาที่พบบ่อย:
- ลืมขยายแพ็ก (
argsกับargs...) - ลำดับการประเมินค่าในนิพจน์การพับ (ซ้ายกับขวามีความสำคัญสำหรับตัวดำเนินการที่ไม่เปลี่ยนหมู่)
- เวลาคอมไพล์เพิ่มขึ้นเมื่อมีการเรียกซ้ำที่ลึก
ตรวจสอบอย่างรวดเร็ว
คุณลักษณะใดของ C++17 ที่ช่วยให้การหาผลรวมขององค์ประกอบทั้งหมดในแพ็กพารามิเตอร์ง่ายขึ้น
สรุปทบทวน
เทมเพลตแบบหลายอาร์กิวเมนต์รองรับจำนวนอาร์กิวเมนต์ของเทมเพลตที่เปลี่ยนแปลงได้ผ่านแพ็กพารามิเตอร์ นิพจน์การพับของ C++17 แทนที่โค้ดแบบหลายอาร์กิวเมนต์ที่เรียกซ้ำด้วยนิพจน์ที่กระชับ เมื่อใช้ร่วมกับการส่งต่ออย่างสมบูรณ์ สิ่งเหล่านี้เป็นกำลังสำคัญของฟังก์ชันสร้างวัตถุและการเลือกเรียกใช้แบบทั่วไป
คำถามที่พบบ่อย
บทเรียน “เทมเพลตแปรผันและแพ็กพารามิเตอร์” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “เทมเพลตแปรผันและแพ็กพารามิเตอร์” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C++ Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C++ Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “เทมเพลตแปรผันและแพ็กพารามิเตอร์”
ใช้แพ็กพารามิเตอร์และนิพจน์พับเพื่อเขียนเทมเพลตแปรผัน คุณปฏิบัติ C++ Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C++ Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน C++ Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “เทมเพลตแปรผันและแพ็กพารามิเตอร์” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน C++ Academy นี้ได้ไหม
ได้ บทเรียน C++ Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ทบทวนเทมเพลตฟังก์ชันและคลาส
- การทำเทมเพลตเฉพาะแบบบางส่วนและทั้งหมด
- เทมเพลตแปรผันและแพ็กพารามิเตอร์
- ฟังก์ชัน constexpr และ if constexpr