(Cโบโบ) ๐คLambda
๋๋ ์ด์ ๋ชจ๋์ธ์ด๋ผ๊ณ . ์ข ๋ ๋ณต์กํ์ง๋ง(..)
๋ฒ์ญํ๊ธธ ์ต๋ช
ํจ์์ด๋ค. functor
์ฒ๋ผ ๊ฐ๋จํ๊ฒ ์ฌ์ฉํ ์ ์์ผ๋ฉด์๋ ํด๋์ค๋ฅผ ์ ์ธํ์ง ์์๋ ๋๋ ํธ๋ฆฌํ ๊ธฐ๋ฅ์ด๋ค. ๊ฐ๋
์ฑ์ ํด์น๋ค๋ ๊ฒฌํด๋ ์์ง๋ง(๋๋ ๊ทธ๋ฌ์ง๋ง), ์๋ฐ์คํฌ๋ฆฝํธ์์ ํ์ดํ ํจ์๋ฅผ ์ฐ๋ค๋ณด๋ ์ด์ ๋๋ ์ข์๋ณด์ธ๋ค.
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int v1 = 2;
int v2 = 3;
int v3 = 4;
//auto f1 = [](int n) { return n + v1 + v2; };
auto f2 = [v1, v2](int n) { return n + v1 + v2; };
auto f3 = [=](int n) { return n + v1 + v2 + v3; };
//auto f4 = [v1](int n) { return v1 = n; };
auto f5 = [&v1](int n) { return v1 = n; };
auto f6 = [&](int n) { return v1 = n; v2 = n; };
return 0;
}
์ ์ฒ๋ผ ๊ฐ๋จํ๊ฒ ์ฌ์ฉํ ์ ์์ผ๋, ์ฃผ์ํ ์ ๊ทธ๋ฆฌ๊ณ ํ๊ธฐ์ ์ธ ์ ์ Capture
์ด๋ค. ์ฒจ์([ ]) ์์ ์ธ๋ถ์ context(๋ณ์๋ this ๋ฑ)๋ฅผ ๋ฃ์ผ๋ฉด lambda ๋ด์์ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ด๋ค. ์ ๋ฌํ๋ ๋ฐฉ์์ ๋ณต์ฌ ํน์ ์ฐธ์กฐ๊ฐ ๋ชจ๋ ๊ฐ๋ฅํ๋ค. ์ด๋ ๋ค๋ฅธ ์ธ์ด์์๋ ์ ๊ณตํ๋ closure
์ ๊ฐ๋
์ด๋ผ๊ณ ํ ์ ์๋ค. ์ง์ ๊ตฌํํด๋ณธ๋ค๋ฉด ์๋์ ๊ฐ์ ํด๋์ค์ ํํ๊ฐ ๋ ์ ์๋ค.
class closure_object
{
private: const int value1, value2;
public:
closure_object(int n1, int n2) : value1(n1), value2(n2) {}
int operator()(int n) const { return n + value1 + value2; }
};
int main()
{
int v1 = 1, v2 = 2;
auto f1 = [v1, v2](int n) { return n + v1 + v2; };
cout << f1(10) << endl;
auto f2 = closure_object(v1, v2); // [v1, v2](int n) { n + v1 + v2 }์ ๋์ผ
cout << f2(10) << endl; // ๊ฐ์๊ธฐ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ด ๋์ด๋ฒ๋ ธ๋ค
return 0;
}
๋ค๋ง lambda์ ๋จ์ ์ ๊ผฝ์๋ฉด,
int main()
{
auto f1 = [](int a, int b) { return a + b; };
auto f2 = [](int a, int b) { return a + b; };
cout << typeid(f1).name() << endl;
cout << typeid(f2).name() << endl;
return 0;
}
์ ์์ ์์ f1
, f2
๋ ์๋ก ๋ค๋ฅธ ํ์
์ด๋ฉฐ, ์ ๊ตฌํ์ฒ๋ผ ์ผ์ข
์ ๋ค๋ฅธ ํด๋์ค๊ฐ ๋๋ค. ๋ฐ๋ผ์ ๊ฐ์ ๊ธฐ๋ฅ์์๋ ๋ณ๋์ ๊ธฐ๊ณ์ด ์ฝ๋๋ฅผ ๊ฐ์ง๋ฉฐ code size๊ฐ ๋์ด๋ ์ ์๋ค.