Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Lambda tổng quát (Generic Lambda) trong C++14

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: auto tham 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