Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++14 제네릭 람다(Generic Lambda)의 작동 원리와 활용법

C++11에서 처음 도입된 람다(lambda)는 다른 함수 호출문 안에 중첩될 수 있는 익명 함수 객체입니다. 람다 표현식을 auto 키워드와 함께 사용하면 변수에 저장해 두고 나중에 재사용할 수도 있습니다.

C++14에서는 람다 표현식이 한층 개선되어 제네릭 람다(generic lambda)를 지원하게 되었습니다. 매개변수 타입을 auto로 선언하면 컴파일러가 전달된 인자의 타입을 자동으로 추론하기 때문에, 마치 템플릿처럼 여러 타입에 대해 동작하는 람다를 만들 수 있습니다. 예를 들어 정수 덧셈, 실수 덧셈, 문자열 연결까지 하나의 람다로 처리하고 싶을 때 제네릭 람다가 매우 유용합니다.

제네릭 람다의 기본 문법

제네릭 람다 표현식은 다음과 같은 형태로 작성합니다.

[](auto x, auto y) { return x + y; }

매개변수 xy의 타입이 auto로 선언되어 있으므로, 호출 시점에 전달되는 인자의 타입에 따라 각각 다른 함수 호출 연산자가 생성됩니다.

예제 코드

아래 예제를 통해 제네릭 람다가 어떻게 동작하는지 확인해 보겠습니다.

#include <iostream>
#include <string>
using namespace std;

int main() {
    // 제네릭 람다 정의
    auto add = [](auto arg1, auto arg2) {
        return arg1 + arg2;
    };

    cout << "정수 합: " << add(5, 8) << endl;
    cout << "실수 합: " << add(2.75, 5.639) << endl;
    cout << "문자열 연결: " << add(string("Hello "), string("World")) << endl;

    return 0;
}

실행 결과

정수 합: 13
실수 합: 8.389
문자열 연결: Hello World

위 실행 결과에서 볼 수 있듯이, 단 하나의 람다가 정수, 실수, 문자열 등 서로 다른 타입에 대해서도 모두 올바르게 동작합니다. 이는 컴파일러가 각 호출 시점에 전달된 인자 타입에 맞는 operator()를 자동으로 생성해 주기 때문입니다. 이처럼 제네릭 람다를 활용하면 타입별로 중복 코드를 작성할 필요 없이 간결하고 유연한 코드를 작성할 수 있습니다.