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

เทมเพลตแปรผันและแพ็กพารามิเตอร์

ใช้แพ็กพารามิเตอร์และนิพจน์พับเพื่อเขียนเทมเพลตแปรผัน

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

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

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