반응형
람다식의 장점
간단한 함수를 빠르게 만들어 구현할 수 있습니다.
람다식의 단점
디버깅하기 힘들어질 수 있습니다.
함수 재사용성이 낮아집니다. 사람들은 보통 함수를 새로 만들기 전에 클래스에 있는 기존 함수를 찾아봅니다. 람다 함수는 눈에 잘 띄지 않아서 못찾을 가능성이 높습니다. 그럼 코드 중복이 발생하게 되는 것입니다.
베스트 프랙티스
기본적으로 이름 있는 함수를 씁니다. 자잘한 함수는 람다로 써도 괜찮습니다. 허나 재사용할 수 있는 함수를 찾기는 어렵습니다. 정렬 함수 처럼 stl 컨테이너에 매개변수로 전달할 함수들도 좋은 후보입니다. qsort()에 함수 포인터 넘겨주기보다는 람다가 확실히 더 좋습니다.
#include <string>
#include <iostream>
#include "LambdaExpressionsExample.h"
using namespace std;
namespace samples
{
void LambdaExpressionsExample()
{
int i = 0;
float f = 1.0f;
char c = 'b';
auto noCapturing = []()
{
cout << "No capture:" << endl;
// Compile Error
// cout << "i: " << i << endl;
// cout << "f: " << f << endl;
// cout << "c: " << c << endl;
};
auto capturedByValue = [=]()
{
cout << "Capture by value:" << endl;
cout << "i: " << i << endl;
cout << "f: " << f << endl;
cout << "c: " << c << endl;
// Compile error
// i++;
// f = 2.0f;
// c = 'a';
};
auto capturedByRef = [&]()
{
cout << "Capture by reference:" << endl;
cout << "i: " << i << endl;
cout << "f: " << f << endl;
cout << "c: " << c << endl;
i++;
f++;
c++;
cout << "i: " << i << endl;
cout << "f: " << f << endl;
cout << "c: " << c << endl;
i--;
f--;
c--;
};
auto capturedByVariableNames = [i, f]()
{
cout << "Capture by variable names value:" << endl;
cout << "i: " << i << endl;
cout << "f: " << f << endl;
// Compile error
// cout << "c: " << c << endl;
// i++;
// f++;
};
auto capturedByVariableNamesRef = [&i, &f]()
{
cout << "Capture by varibale names reference:" << endl;
cout << "i: " << i << endl;
cout << "f: " << f << endl;
// Compile error
// cout << "c: " << c << endl;
i++;
f++;
cout << "i: " << i << endl;
cout << "f: " << f << endl;
i--;
f--;
};
auto capturedByMix = [=, &f, &c]()
{
cout << "Capture by value by default, then by variable names reference" << endl;
cout << "i: " << i << endl;
cout << "f: " << f << endl;
cout << "c: " << c << endl;
// Compile error
// i++;
f++;
c++;
cout << "i: " << i << endl;
cout << "f: " << f << endl;
cout << "c: " << c << endl;
f--;
c--;
};
auto capturedByValueMutable = [=]() mutable
{
cout << "Capture by value with mutable specifier" << endl;
i++;
f++;
c++;
};
capturedByValue();
capturedByRef();
capturedByVariableNames();
capturedByVariableNamesRef();
capturedByMix();
capturedByValueMutable();
cout << "i: " << i << endl;
cout << "f: " << f << endl;
cout << "c: " << c << endl;
}
}
람다식을 기본적으로 활용한 좋은 예제들이 있어 공유합니다. 원본 코드는 아래 경로에서 확인하실 수 있습니다.
https://github.com/POCU/COMP3200CodeSamples/blob/master/13/LambdaExpressionsExample.cpp
반응형
'SW > C++' 카테고리의 다른 글
C++ : unordered_set : 개념, 차이점, 장점, 예제, 구현 (0) | 2020.05.01 |
---|---|
C++ : unordered_map : 개념, 장점, 예제, 구현 (0) | 2020.04.30 |
C++ : 람다식 : 개념, 예제, 구성, 방법, 활용법 (0) | 2020.04.28 |
C++ : constexpr : 개념, 예제, 사용법, 필요성, 장점 (0) | 2020.04.27 |
C++ : 이동대입연산자 : 개념, 예제, 활용방법 (0) | 2020.04.26 |