Lambda function
ํจ์ ์์์ ๋ถ๋ฅผ ์ ์๋ย Local function! ์ฌ์ค ์ ์ฒด๋ ๊ฐ์ฒด์ด์ง๋ง, ์ฐ๋ฆฌ๋ ํจ์์ ๊ฐ๋ ์ผ๋ก ๊ฐ๋ค ์ด๋ค!
Usage
[closure](์
๋ ฅ ๋งค๊ฐ๋ณ์)->์ถ๋ ฅ type{๋ด์ฉ}
Local function ์ด๊ธฐ ๋๋ฌธ์ ๋ง๋ค์ด์ก๋ค๊ฐ ๋ฆฌํด ํ ์ฌ๋ผ์ง๋ค.
Example
#include <iostream>
#include <vector>
#include <functional>
using namespace std;
int evaluate(int(*func)(int, int), int x, int y){
return func(x, y);
}
int main(){
// sum: [](int x, int y)->int{return x + y;}
cout << evaluate([](int x, int y)->int{return x + y;}, 2, 3) << endl;
// mult: [](int x, int y)->int{return x*y;}
// mult: [](int x, int y){return x*y;} ๊ตณ์ด ์์ ์ด๋๋ผ ๋๋ฌด ๋ช
ํํด์
cout << evaluate([](int x, int y){return x * y;}, 2, 3) << endl;
// lambda ํจ์๋ฅผ ๋ฐ๋ก ์์ฑํด์ ํธ์ถ
[](int x, int y){cout << x << ", " << y << endl;}(2,3);
auto f = [](int x, int y)->int{return x - y;};
cout << f(3, 5) << endl;
}
evaluate
ย ํจ์๋ ํจ์ ํฌ์ธํฐ์, ์ธ์ ๋๊ฐ๋ฅผ ๋ฐ์, ํด๋นํ๋ ํจ์๋ฅผ ๋ฆฌํดํด์ฃผ๋ ํจ์์ด๋ค. main
ย ํจ์ ๋ด์์ ์ฆ์์ผ๋ก ๋ด๊ฐ ์ํ๋ ํจ์๋ฅผ ๋ง๋ค๊ณ , evaluate
ย ํจ์๋ฅผ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด Lambda function ์ ์ฌ์ฉํ๋ฉด ๋๋ค!
closure
์ฐ๋ฆฌ๊ฐ ๊ธฐ์กด์ ํจ์๋ฅผ ๋ง๋ค ๋, ๋๋ค ํจ์๋ฅผ ์ฌ์ฉํ ๋ ์ฐ๋ฆฌ๋ ์ด๊ฑธ ํจ์์ฒ๋ผ ์ฌ์ฉํ๋ค. ์ฆ, ์ ๋ ฅ ํ๋ผ๋ฏธํฐ๋ฅผ ์ ์ธํ๊ณ ๋ ํจ์์ ๊ตฌํ๋ถ์์ ๋ค๋ฅธ ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์์๋ค.
ํ์ง๋ง ๋๋คํจ์์ ๊ฒฝ์ฐ, ์ ๋ ฅ ํ๋ผ๋ฏธํฐ์ด์ธ์ ๋ณ์๋ฅผ ์ฝ์ด์ฌ ์ ์๋ค.
๋๋ค ํจ์๊ฐ ํน์ ํจ์์ย ์ง์ญ ํจ์ย ์ฒ๋ผ ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์ธ๋ฐ, ๋๋คํจ์๊ฐ ์ํด์๋ ํจ์์ ๋ณ์๋ฅผ ๊ฐ์ ธ์ ์ฌ์ฉํ ์ ์๋ค.
์ด ์ ๋๋ฌธ์, ๊ธ์ ๋์ ๋ถ์์ ๋๋คํจ์์ ์ ์ฒด๋ ๊ฐ์ฒด๋ผ๊ณ ํ๋ ๊ฒ์ด๋ค! ํจ์์ ๋ชจ์์ ํ๊ณ ์์ง๋ง, ํด๋์ค ๊ตฌ์ฑ์ด ๊ฐ์ฒด์ฒ๋ผ ๋์ด ์๋ค.(๋ํผ์ )
์ฌ์ฉ์๋ ๋ค์๊ณผ ๊ฐ๋ค.
int evaluate(int(*func)(int, int), int x, int y){
return func(x, y);
}
int main(){
int a;
cin >> a;
// [](int x, int y){return x*y;}
// [closure]: capturing variables
// [] ์์ ๋ณ์๋ฅผ ๋ฃ์ผ๋ฉด ์ด ๋๋ค ํจ์๋ด์์ ์ฌ์ฉํ ์ ์๋ค.
// ์๋๋ ์ธํํ๋ผ๋ฏธํฐ๋ง ์ฌ์ฉ๊ฐ๋ฅํ๋๋ฐ , ์ธ๋ถ ๋ณ์๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค๋ ๊ฒ
// [a] : ๋ณ์ a๋ฅผ call by value ๋ก ํจ์์ ์ ๋ฌ
// [&a] : ๋ณ์ a๋ฅผ call by reference๋ก ํจ์์ ์ ๋ฌ
// [=]: ๋ชจ๋ ์ฃผ์ ๋ณ์๋ฅผ call by value๋ก ํจ์์ ์ ๋ฌ
// [&]: ๋ชจ๋ ์ฃผ์ฐ ๋ณ์๋ฅผ call by reference๋ก ํจ์์ ์ ๋ฌ
cout << evaluate([a](int x, int y){return a*x*y;}, 2, 3) << endl;
return 0;
}
Function Object
์ฐ๋ฆฌ๊ฐ ์์์ ๊ตฌํํย evaluate
ย ํจ์์์, ํจ์ ํฌ์ธํฐ๋ก ์ฒซ๋ฒ์งธ ์ธ์๋ฅผ ์ฃผ์๋ค.
๊ทธ๋ฐ๋ฐ, ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํด์ ๋ํ๋ด๋ ๊ฒ์ ์ํํ๋ฏ๋ก, ์ฐ๋ฆฌ๋ ์ด๊ฒ์ ํํํ ์ ์๋ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ๊ด๋ฆฌํ๋ ๊ฒ์ด ๋ณด๋ค ์์ ํ๋ค.
์ด ๊ฒ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ๊ฐ์ฒด๊ฐย function
ย ์ด๋ค.
function<์ถ๋ ฅ์๋ฃํ<์
๋ ฅ์๋ฃํ1, ์
๋ ฅ์๋ฃํ2...>ํจ์ ์ด๋ฆ
Usage
int evaluate2(function<int(int, int)>func , int x, int y){
return func(x, y);
}