C++11 giới thiệu lambda expression (hàm vô danh). C++14 nâng cấp với Generic Lambda (hay Generalized Lambda) — cho phép tham số kiểu auto, khiến lambda trở thành hàm mẫu (template) ngầm, có thể xử lý nhiều kiểu dữ liệu khác nhau.
Cú pháp
[capture](auto param1, auto param2) { /* body */ }
autotrong tham số lambda hoạt động như tham số template.- Mỗi lần gọi với kiểu khác, compiler sinh ra một overload riêng.
Ví dụ: Lambda cộng chung cho int, double, string
#include <iostream>
#include <string>
using namespace std;
int main() {
// Lambda tổng quát: auto cho phép nhiều kiểu
auto add = [](auto a, auto b) {
return a + b;
};
// Gọi với int
cout << "Tong nguyen: " << add(5, 8) << '\n'; // 13
// Gọi với double
cout << "Tong thuc: " << add(2.75, 5.639) << '\n'; // 8.389
// Gọi với string (cần ép kiểu hoặc dùng string literal C++14)
cout << "Noi chuoi: " << add(string("Hello "), string("World")) << '\n'; // Hello World
// C++14 cho phép string literal với suffix s
using namespace std::string_literals;
cout << "Noi chuoi (C++14): " << add("Hello "s, "World"s) << '\n';
return 0;
}
Kết quả
Tong nguyen: 13 Tong thuc: 8.389 Noi chuoi: Hello World Noi chuoi (C++14): Hello World
Ứng dụng thực tế
- Viết thuật toán generic (sắp xếp, tìm kiếm) ngắn gọn mà không cần viết hàm template riêng.
- Kết hợp với STL algorithms:
sort(v.begin(), v.end(), [](auto a, auto b){ return a > b; }); - Lambda generic có thể capture bằng reference/value như lambda thường.
Lưu ý
- Yêu cầu trình biên dịch hỗ trợ C++14 (GCC 4.9+, Clang 3.4+, MSVC 2015+).
- Khi dùng
autotrong lambda, kiểu trả về được suy diễn tự động (giốngautofunction return type). - Có thể dùng
decltype(auto)cho kiểu trả về nếu cần chính xác (hiếm).
Generalized lambda là một bước tiến lớn giúp C++ gần hơn với lập trình hàm (functional programming) và giảm code boilerplate đáng kể.