SW/C++

C++ : 람다식 : 장점, 단점, 배스트 프랙티스, 예제, 구현

얇은생각 2020. 4. 29. 07:30
반응형

C++ : 람다식 : 장점, 단점, 배스트 프랙티스, 예제, 구현

 

람다식의 장점

간단한 함수를 빠르게 만들어 구현할 수 있습니다.

 

람다식의 단점

디버깅하기 힘들어질 수 있습니다. 

함수 재사용성이 낮아집니다. 사람들은 보통 함수를 새로 만들기 전에 클래스에 있는 기존 함수를 찾아봅니다. 람다 함수는 눈에 잘 띄지 않아서 못찾을 가능성이 높습니다. 그럼 코드 중복이 발생하게 되는 것입니다. 

 

베스트 프랙티스

기본적으로 이름 있는 함수를 씁니다. 자잘한 함수는 람다로 써도 괜찮습니다. 허나 재사용할 수 있는 함수를 찾기는 어렵습니다. 정렬 함수 처럼 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

 

POCU/COMP3200CodeSamples

Code samples for COMP3200. Contribute to POCU/COMP3200CodeSamples development by creating an account on GitHub.

github.com

반응형