C++11에서 처음 도입된 람다(lambda)는 다른 함수 호출문 안에 중첩될 수 있는 익명 함수 객체입니다. 람다 표현식을 auto 키워드와 함께 사용하면 변수에 저장해 두고 나중에 재사용할 수도 있습니다.
C++14에서는 람다 표현식이 한층 개선되어 제네릭 람다(generic lambda)를 지원하게 되었습니다. 매개변수 타입을 auto로 선언하면 컴파일러가 전달된 인자의 타입을 자동으로 추론하기 때문에, 마치 템플릿처럼 여러 타입에 대해 동작하는 람다를 만들 수 있습니다. 예를 들어 정수 덧셈, 실수 덧셈, 문자열 연결까지 하나의 람다로 처리하고 싶을 때 제네릭 람다가 매우 유용합니다.
제네릭 람다의 기본 문법
제네릭 람다 표현식은 다음과 같은 형태로 작성합니다.
[](auto x, auto y) { return x + y; }매개변수 x와 y의 타입이 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()를 자동으로 생성해 주기 때문입니다. 이처럼 제네릭 람다를 활용하면 타입별로 중복 코드를 작성할 필요 없이 간결하고 유연한 코드를 작성할 수 있습니다.