lambdaํจ์ ์ ์std::functionํ์ ์ ์ ์ฅํ์ฌ ์ ๋ฌ- ํจ์ ํฌ์ธํฐ์๋ ๋ค๋ฅด๊ฒ ๋์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ํฌํจํ๋ ๊ตฌ์กฐ
- ์ฌ๋ผ์ด๋ ๊ธฐ๋ฐ์ผ๋ก STL ์ธ์ ์ฌ์ฉ ๊ธ์ง
#include <iostream>
#include <functional> // std::function ์ฌ์ฉ ๊ฐ๋ฅ
#include <vector>
void applyFunctionToVector(const std::vector<int>& v, std::function<void(int)> fn) {
for (int val : v)
fn(val);
}
int main() {
std::vector<int> nums = { 10, 20, 30 };
// ๋๋ค ํจ์: ์บก์ฒ ์์ด ์ธ๋ถ ํจ์์ ์ ๋ฌ
std::function<void(int)> printDouble = [](int x) {
std::cout << x * 2 << std::endl;
};
applyFunctionToVector(nums, printDouble);
}
๐ ์ std::function์ด ๋์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ์ ๋ฐํ๋๊ฐ?
std::function์ ๋ด๋ถ์ ์ผ๋ก lambda๋ ๋ค๋ฅธ call object๋ฅผ ์ ์ฅํ๊ธฐ ์ํด type erasure์ ํ ํ ๋น์ ์ฌ์ฉํ ์ ์์ด์. ํนํ ๋๋ค ๋ด๋ถ์ ์บก์ฒ๋ ๋ณ์๊ฐ ์๊ฑฐ๋ ๋ณต์กํ ํํ์ผ์๋ก ํ ํ ๋น์ด ๋ฐ์ํฉ๋๋ค.
โ ๏ธ ์ฐจ์ด์ (std::function vs function pointer)
void(*f)(int)๋ ์ ์ ํฌ๊ธฐ์ด๊ณ ๋จ์ ํฌ์ธํฐstd::function<void(int)>๋ ๊ฐ๋ณ ํฌ๊ธฐ call object ์ ์ฅ ๊ฐ๋ฅ, ํ ํ ๋น ๊ฐ๋ฅ์ฑ ์กด์ฌ๐ ๊ฒฐ๋ก
์ฌ๋ผ์ด๋์ ๋์จ lambda & std::function์ ์กฐํฉํ์ฌ ์ถ์ ๋ ๊ฐ๋ฅ์ฑ์ด ๋์ ๋ฌธ์ ๋ "๋๋ค๋ฅผ ์ฌ์ฉํด std::function์ ๋ด๊ณ ์ด๋ฅผ ์ธ์๋ก ์ ๋ฌํด์ ์คํํ๋ ๊ตฌ์กฐ"์
๋๋ค. ์ ์์ ๋ฅผ ์ ์ดํดํด๋๋ฉด ๋์ ๊ฐ๋ฅํด์.
ํ์ํ๋ฉด mutable, ์บก์ฒ [=], [&] ๊ฐ์ ๋๋ค ๊ณ ๊ธ ์์ ๋ ๋ง๋ค์ด์ค๊ฒ์.