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
2021.07.23 - [일하기/C++] - C++ 람다 식 공부 (5) - Examples
템플릿에 람다 식 사용
예제
람다 식이 형식화되기 때문에 C++ 템플릿과 함께 사용할 수 있습니다. 다음 예제에서는 negate_all 및 print_all 함수를 보여 줍니다. negate_all함수는 vector 객체의 각 요소 단항 operator- 를 적용합니다. print_all 함수는 vector 객체의 각 요소를 콘솔에 인쇄합니다.
코드
// template_lambda_expression.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
// Negates each element in the vector object. Assumes signed data type.
template <typename T>
void negate_all(vector<T>& v)
{
for_each(v.begin(), v.end(), [](T& n) { n = -n; });
}
// Prints to the console each element in the vector object.
template <typename T>
void print_all(const vector<T>& v)
{
for_each(v.begin(), v.end(), [](const T& n) { cout << n << endl; });
}
int main()
{
// Create a vector of signed integers with a few elements.
vector<int> v;
v.push_back(34);
v.push_back(-43);
v.push_back(56);
print_all(v);
negate_all(v);
cout << "After negate_all():" << endl;
print_all(v);
}
출력
34
-43
56
After negate_all():
-34
43
-56
설명
C + + 템플릿에 대 한 자세한 내용은 템플릿을 참조하세요.
● Templates 참조
예외 처리
예제
람다 식의 본문은 SEH(구조적 예외 처리)와 C++ 예외 처리에 대한 규칙을 따릅니다. 람다 식의 본문에는 예외 발생을 처리하거나 예외 처리를 포함하는 범위를 지연시킬 수 있습니다. 다음 예제에서는 for_each 함수 및 람다 식을 사용하여 vector 다른 개체의 값으로 개체를 채웁니다. 블록을 사용 하여 try / catch 첫 번째 벡터에 대 한 잘못된 액세스를 처리합니다.
코드
// eh_lambda_expression.cpp
// compile with: /EHsc /W4
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
int main()
{
// Create a vector that contains 3 elements.
vector<int> elements(3);
// Create another vector that contains index values.
vector<int> indices(3);
indices[0] = 0;
indices[1] = -1; // This is not a valid subscript. It will trigger an exception.
indices[2] = 2;
// Use the values from the vector of index values to
// fill the elements vector. This example uses a
// try/catch block to handle invalid access to the
// elements vector.
try
{
for_each(indices.begin(), indices.end(), [&](int index) {
elements.at(index) = index;
});
}
catch (const out_of_range& e)
{
cerr << "Caught '" << e.what() << "'." << endl;
};
}
● indices의 값인 -1이 index 값으로 사용되면서 예외 발생하는 예제이다.
출력
Caught 'invalid vector<T> subscript'.
● 컴파일러에 따라 출력되는 결과가 다를 수 있다. gcc version 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04) 버전에서는 [Caught 'vector::_M_range_check: __n (which is 18446744073709551615) >= this->size() (which is 3)'] 으로 출력
설명
예외 처리에 대 한 자세한 내용은 예외 처리를 참조하세요.
● Exception Handling 참조
관리되는 형식이 있는 람다 식 사용 (C++/CLI)
예제
람다 식의 캡처 절에는 관리되는 형식의 변수가 포함될 수 없습니다. 그러나 관리되는 형식이 포함된 인수를 람다 식의 매개 변수 목록으로 전달할 수 있습니다. 다음 예제에서는 관리되지 않는 지역 변수 ch를 캡처하는 람다 식을 포함하고 매개 변수로서 System.String 개체를 가져옵니다.
● 이 부분은 .NET Library 관련된 부분이라 PASS
코드
// managed_lambda_expression.cpp
// compile with: /clr
using namespace System;
int main()
{
char ch = '!'; // a local unmanaged variable
// The following lambda expression captures local variables
// by value and takes a managed String object as its parameter.
[=](String ^s) {
Console::WriteLine(s + Convert::ToChar(ch));
}("Hello");
}
출력
Hello!
설명
STL/CLR 라이브러리에서 람다 식을 사용할 수도 있습니다. 자세한 내용은 STL/CLR 라이브러리 참조를 참조하세요.
중요
람다는 ref class ,, ref struct value class 및 과 같은 CLR (공용 언어 런타임) 관리되는 엔터티에서 지원되지 value struct 않습니다.
'놀기 > C, C++' 카테고리의 다른 글
C++ 람다 식 공부 (5) - 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 |
댓글