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

Biểu thức Lambda tổng quát (Generalized Lambda) trong C++14

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 */ }
  • auto trong 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 auto trong lambda, kiểu trả về được suy diễn tự động (giống auto function 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ể.