본문 바로가기

프로그래밍/C++

Lambda (람다)

auto Lambda = [캡처_블록](파라미터_목록)mutable 익셉션_목록 속성_지정 -> 리턴_타입{함수_바디};
 캡처 블록 : 람다 함수 안에서 참조할 바깥 변수들을 지정한다.
 지정한 변수들은 람다 함수의 스코프 안으로 들어와서 함수 바디에서 접근할 수 있게 된다.
파라미터 목록 (생략 가능) : 표현식에서 넘겨받을 파라미터 목록을 정의한다.
생략하려면 mutable, 익셉션 목록, 리턴 타입을 지정하지 않아야 한다.
mutable (생략 가능) : 람다 함수의 const 속성을 지워서 캡처받은 변수를 수정할 수 있게 한다.
익셉션 목록 (생략 가능) : 람다 표현식의 바디 본체 안에서 throw 할 수 있는 익셉션 종류를 지정한다.
속성 지정 (생략 가능) : 람다 표현식의 속성을 지정한다.
리턴 타입 (생략 가능) : 람다 표현식의 리턴 타입을 지정한다. 생략하게 되면 일반 함수의 리턴 타입이
추론되는 것과 같이 자동으로 추론된다.
변수를 캡처한다는 의미는 그 변수를 람다 표현식의 본체 안에서 사용할 수 있게 된다는 것이다.
[]와 같이 공백으로 캡처블록을 정의하면 주변 스코프 내의 어떤 변수도
람다 표현식 안에서 사용하지 않는 것을 의미한다
 캡처 블록 안에 변수 이름을 지정하면 그 변수를 값으로서 복제하여 사용하게 된다
 컴파일러는 람다 표현식을 함수 객체의 한 종류로 변환한다
 캡처된 변수는 함수 객체의 멤버 변수로 복제된다
이 멤버 변수는 캡처된 변수의 const 설정을 그대로 상속받는다.

// data가 non-const 타입이므로 함수 객체가 non-const 타입의 data 멤버 변수를 가지게 된다
     double data = 1.23;
     auto capturingLambda = [data] {cout << "Data = " << data << endl; };
     capturingLambda();

 캡처된 복제본의 값을 바꾸고 싶다면 mutable 속성을 지정해야 한다.
 변수를 캡처할 때 &을 덧붙여서 참조로 캡처할 수도 있다.
 C++ 14 부터는 람다 표현식에 대해 자동 타입 추론 기능이 지원된다.
명시적인 타입 지정 없이 auto 를 사용할 수 있다.

        vector<int> ints{ 11, 55, 101, 200 };
        vector<double> doubles{ 11.1, 55.5, 200.2 };
        // 100을 넘는 값을 찾는 제네릭 람다 표현식 정의
        auto isGreaterThan100 = [](auto i) {return i > 100; };
        auto iter = find_if(cbegin(ints), cend(ints), isGreaterThan100);
        if (iter != cend(ints))
               cout << "Found a value > 100 : " << *iter << endl;
        auto iter2 = find_if(cbegin(doubles), cend(doubles), isGreaterThan100);
        if (iter2 != cend(doubles))
               cout << "Found a value > 100 : " << *iter2 << endl;

'프로그래밍 > C++' 카테고리의 다른 글

보기 좋은 코드의 중요성과 코드의 디자인  (0) 2019.03.09
auto, decltype, 문자열  (0) 2019.03.08
가상 메모리 (Virtual Memory)  (0) 2019.02.23
동기화 (Synchronization)  (0) 2019.02.21
커널 영역과 유저 영역  (0) 2019.02.20