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

แลมบ์ดาทั่วไปและคลอเชอร์ใน C++14

เขียนแลมบ์ดาทั่วไปด้วยพารามิเตอร์ auto และวิเคราะห์ชนิดของคลอเชอร์

บทเรียน 3 จาก 413 ขั้นตอน

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

แลมบ์ดาทั่วไป

C++14 ช่วยให้คุณเขียน auto ในรายการพารามิเตอร์ของแลมบ์ดาได้ คอมไพเลอร์จะสร้าง operator() แบบแม่แบบขึ้นมา ทำให้แลมบ์ดารับชนิดข้อมูลใด ๆ ได้

auto print = [](const auto& x) {
    std::cout << x << "\n";
};

print(42);
print("hello");
print(3.14);

กลไกการทำงาน

แลมบ์ดาจะกลายเป็นคลาสที่มี operator() แบบแม่แบบ ชุดชนิดข้อมูลที่ไม่ซ้ำกันแต่ละชุดจะสร้างอินสแตนซ์ของฟังก์ชันแยกกันอยู่เบื้องหลัง

กรณีการใช้งาน

แลมบ์ดาทั่วไปมีประโยชน์อย่างมากในอัลกอริทึมที่ทำงานกับชนิดข้อมูลหลายชนิด

std::vector<int> ints = {1, 2, 3};
std::vector<std::string> strs = {"a", "b"};

auto printAll = [](const auto& container) {
    for (const auto& x : container) std::cout << x << " ";
};
printAll(ints);
printAll(strs);

พารามิเตอร์ auto หลายตัว

auto แต่ละตัวทำงานแยกจากกัน พารามิเตอร์ต่างตัวกันจึงสามารถอนุมานเป็นชนิดข้อมูลต่างกันได้

auto add = [](auto a, auto b) {
    return a + b;
};
std::cout << add(1, 2.5);            // 3.5
std::cout << add(std::string("Hi"), "!");  // Hi!

คลอเชอร์คือออบเจ็กต์

นิพจน์แลมบ์ดาแต่ละนิพจน์จะสร้างคลอเชอร์ ซึ่งเป็นอินสแตนซ์ของคลาสที่คอมไพเลอร์สร้างขึ้นและมีชนิดเฉพาะ คลอเชอร์จะจัดเก็บตัวแปรที่จับไว้เป็นสมาชิก

ชนิดเฉพาะสำหรับแลมบ์ดาแต่ละตัว

นิพจน์แลมบ์ดาแต่ละนิพจน์มีชนิดเฉพาะ แม้ว่าแลมบ์ดาสองตัวจะมีข้อความเหมือนกันทุกประการ คุณไม่สามารถเขียนชื่อชนิดโดยตรงได้ ให้ใช้ auto หรือ std::function

การจัดเก็บแลมบ์ดาใน std::function

หากต้องการเก็บแลมบ์ดาไว้ในตัวแปรที่ทราบชนิด ให้ห่อแลมบ์ดานั้นด้วย std::function วิธีนี้มีค่าใช้จ่ายเพิ่มขึ้นเล็กน้อย แต่ช่วยให้เกิดพหุสัณฐานขณะทำงานกับสิ่งที่เรียกใช้งานได้

#include <functional>
std::function<int(int)> doubler = [](int x) { return x * 2; };

ต้นทุนของการลบชนิด

std::function ใช้การลบชนิด จึงสามารถจัดเก็บสิ่งที่เรียกใช้งานได้ที่เข้ากันได้ทุกชนิด แต่ต้องจัดสรรหน่วยความจำบนฮีปและเรียกฟังก์ชันเสมือน หลีกเลี่ยงการใช้ในลูปที่ทำงานบ่อย

เมื่อใดที่ auto ก็เพียงพอ

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

การคืนค่าแลมบ์ดา

ใช้ auto เป็นชนิดผลลัพธ์เพื่อคืนค่าแลมบ์ดา การเรียกแต่ละครั้งจะสร้างคลอเชอร์ใหม่

auto makeAdder(int n) {
    return [n](int x) { return x + n; };
}

auto add5 = makeAdder(5);
std::cout << add5(10);   // 15

ฟังก์ชันลำดับสูง

แลมบ์ดาทำให้ C++ เหมาะกับฟังก์ชันลำดับสูงมากขึ้น ซึ่งก็คือฟังก์ชันที่รับหรือคืนค่าฟังก์ชันอื่น

ตรวจสอบความเข้าใจ

auto ในรายการพารามิเตอร์ของแลมบ์ดา C++14 หมายความว่าอย่างไร

สรุป

แลมบ์ดาทั่วไปของ C++14 ใช้พารามิเตอร์ auto เพื่อทำพหุสัณฐานขณะคอมไพล์ แลมบ์ดาแต่ละตัวมีชนิดคลอเชอร์เฉพาะ ให้ใช้ auto เพื่อเก็บแลมบ์ดา หรือใช้ std::function เมื่อต้องการลบชนิด

เริ่มต้นได้ฟรี

เรียนรู้ C++ ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
51
บทเรียน
203

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

บทเรียน “แลมบ์ดาทั่วไปและคลอเชอร์ใน C++14” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “แลมบ์ดาทั่วไปและคลอเชอร์ใน C++14”

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

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

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

บทเรียน “แลมบ์ดาทั่วไปและคลอเชอร์ใน C++14” ใช้เวลานานแค่ไหน

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

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

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

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

  1. ออบเจ็กต์ฟังก์ชันและฟังก์เตอร์
  2. การจับค่าของแลมบ์ดาแบบค่า แบบรีเฟอเรนซ์ และ mutable
  3. แลมบ์ดาทั่วไปและคลอเชอร์ใน C++14
  4. std::function และออบเจ็กต์เรียกใช้ที่ลบชนิด
← กลับไปที่ C++ Academy