แลมบ์ดาทั่วไปและคลอเชอร์ใน C++14
เขียนแลมบ์ดาทั่วไปด้วยพารามิเตอร์ auto และวิเคราะห์ชนิดของคลอเชอร์
แลมบ์ดาทั่วไปและคลอเชอร์ใน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ออบเจ็กต์ฟังก์ชันและฟังก์เตอร์
- การจับค่าของแลมบ์ดาแบบค่า แบบรีเฟอเรนซ์ และ mutable
- แลมบ์ดาทั่วไปและคลอเชอร์ใน C++14
- std::function และออบเจ็กต์เรียกใช้ที่ลบชนิด