C++14 giới thiệu Generic Lambda (lambda tổng quát) cho phép sử dụng auto cho tham số, cho phép một lambda hoạt động với nhiều kiểu dữ liệu khác nhau — tương tự template function nhưng ngắn gọn hơn.
Cú pháp
// C++11: Phải chỉ định kiểu cụ thể
auto add_int = [](int x, int y) { return x + y; };
// C++14: Generic lambda - auto cho tham số
auto add = [](auto x, auto y) { return x + y; };
Ví dụ: Một lambda cho int, float, string
#include <iostream>
#include <string>
using namespace std;
int main() {
// Generic lambda: auto cho tham số
auto add = [](auto arg1, auto arg2) {
return arg1 + arg2;
};
// Dùng với int
cout << "Tong nguyen: " << add(5, 8) << endl;
// Dùng với float/double
cout << "Tong thuc: " << add(2.75, 5.639) << endl;
// Dùng với string (concatenation)
cout << "Noi chuoi: " << add(string("Hello "), string("World")) << endl;
// C++20: Có thể dùng template syntax rõ ràng hơn
// auto add2 = [](T a, T b) { return a + b; };
}
Kết quả
Tong nguyen: 13 Tong thuc: 8.389 Noi chuoi: Hello World
Cách hoạt động
Generic lambda về bản chất là một function object có template call operator:
// Mở rộng ngầm của compiler:
struct __lambda_123 {
template <typename T, typename U>
auto operator()(T x, U y) const {
return x + y;
}
};
Generic Lambda với capture
int factor = 10;
auto scale = [factor](auto x) { return x * factor; };
cout << scale(5) << endl; // 50 (int)
cout << scale(3.5) << endl; // 35 (double)
Generic Lambda trong STL algorithms
#include <algorithm>
#include <vector>
#include <iostream>
int main() {
vector<int> v = {1, 2, 3, 4, 5};
// In ra bình phương - generic lambda
for_each(v.begin(), v.end(), [](auto x) {
cout << x * x << " ";
});
// Output: 1 4 9 16 25
}
C++20: Template Lambda (cải tiến hơn)
// C++20: Tường minh template parameters
auto add = [](T a, T b) { return a + b; };
// Ràng buộc kiểu (concepts)
auto add_numbers = [](T a, T b) { return a + b; };
// Chỉ chấp nhận kiểu nguyên
Tóm tắt
- C++14:
autotham số → Generic Lambda - Tương đương function template nhưng ngắn gọn
- Hỗ trợ capture, mutable, constexpr
- C++20: Template lambda tường minh + concepts