본문 바로가기
놀기/C, C++

C++ 람다 식 공부 (6) - Examples

by Hi~ 2021. 7. 23.

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

댓글