2021.07.21 - [일하기/C++] - C++ 람다 식 공부 (1)
2021.07.22 - [일하기/C++] - C++ 람다 식 공부 (2)
2021.07.22 - [일하기/C++] - C++ 람다 식 공부 (3)
2021.07.23 - [일하기/C++] - C++ 람다 식 공부 (4) - Examples
Higher-Order 람다 함수
예제
많은 프로그래밍 언어에서 고차 함수의 개념을 지원합니다. 고차 함수는 람다 식으로, 다른 람다 식을 인수로 취하거나 람다 식을 반환합니다. 클래스를 사용하여 function c + + 람다 식이 상위 함수처럼 동작하도록 할 수 있습니다. 다음 예제에서는 function 개체를 반환하는 람다 식과 인수로서 function 개체를 취하는 람다 식을 보여 줍니다.
코드
// higher_order_lambda_expression.cpp
// compile with: /EHsc /W4
#include <iostream>
#include <functional>
int main()
{
using namespace std;
// The following code declares a lambda expression that returns
// another lambda expression that adds two numbers.
// The returned lambda expression captures parameter x by value.
auto addtwointegers = [](int x) -> function<int(int)> {
return [=](int y) { return x + y; };
};
// The following code declares a lambda expression that takes another
// lambda expression as its argument.
// The lambda expression applies the argument z to the function f
// and multiplies by 2.
auto higherorder = [](const function<int(int)>& f, int z) {
return f(z) * 2;
};
// Call the lambda expression that is bound to higherorder.
auto answer = higherorder(addtwointegers(7), 8);
// Print the result, which is (7+8)*2.
cout << answer << endl;
}
출력
30
● function class 참조
함수에서 람다 식 사용
예제
함수의 본문에서 람다 식을 사용할 수 있습니다. 람다 식은 바깥쪽 함수에서 액세스할 수 있는 모든 함수 또는 데이터 멤버에 액세스 할 수 있습니다. this 바깥쪽 클래스의 함수 및 데이터 멤버에 대한 액세스를 제공하기 위해 포인터를 명시적 또는 암시적으로 캡처할 수 있습니다. Visual Studio 2017 버전 15.3 이상 (에서 사용 가능 /std:c++17 ): 원래 개체가 범위를 벗어난 후 실행될 수 있는 비동기 또는 병렬 작업에서 람다를 사용하는 경우 this([*this])를 캡처합니다.
다음과 같이 함수에서 명시적으로 this 포인터를 사용할 수 있습니다.
// capture "this" by reference
void ApplyScale(const vector<int>& v) const
{
for_each(v.begin(), v.end(),
[this](int n) { cout << n * _scale << endl; });
}
// capture "this" by value (Visual Studio 2017 version 15.3 and later)
void ApplyScale2(const vector<int>& v) const
{
for_each(v.begin(), v.end(),
[*this](int n) { cout << n * _scale << endl; });
}
this 포인터를 암시적으로 캡처할 수도 있습니다.
void ApplyScale(const vector<int>& v) const
{
for_each(v.begin(), v.end(),
[=](int n) { cout << n * _scale << endl; });
}
다음 예제에서는 소수 자릿수 값을 캡슐화하는 Scale 클래스를 보여 줍니다.
// function_lambda_expression.cpp
// compile with: /EHsc /W4
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
class Scale
{
public:
// The constructor.
explicit Scale(int scale) : _scale(scale) {}
// Prints the product of each element in a vector object
// and the scale value to the console.
void ApplyScale(const vector<int>& v) const
{
for_each(v.begin(), v.end(), [=](int n) { cout << n * _scale << endl; });
}
private:
int _scale;
};
int main()
{
vector<int> values;
values.push_back(1);
values.push_back(2);
values.push_back(3);
values.push_back(4);
// Create a Scale object that scales elements by 3 and apply
// it to the vector object. Does not modify the vector.
Scale s(3);
s.ApplyScale(values);
}
출력
3
6
9
12
설명
ApplyScale 함수는 람다 식을 사용하여 vector 개체에서 스케일 값 및 각 요소의 곱을 출력합니다. 람다 식이 _scale 멤버에 접근하기 위해 암시적으로 this를 캡처합니다.
'놀기 > C, C++' 카테고리의 다른 글
C++ 람다 식 공부 (6) - Examples (0) | 2021.07.23 |
---|---|
C++ 람다 식 공부 (4) - Examples (0) | 2021.07.23 |
C++ 람다 식 공부 (3) (0) | 2021.07.22 |
C++ 람다 식 공부 (2) (0) | 2021.07.22 |
C++ 람다 식 공부 (1) (0) | 2021.07.21 |
댓글