[cpp] ๐Ÿ“ lambda function๊ณผ ๋™์  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น

minjubyeonยท2025๋…„ 6์›” 15์ผ

cpp

๋ชฉ๋ก ๋ณด๊ธฐ
26/26
  • 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, ์บก์ฒ˜ [=], [&] ๊ฐ™์€ ๋žŒ๋‹ค ๊ณ ๊ธ‰ ์˜ˆ์ œ๋„ ๋งŒ๋“ค์–ด์ค„๊ฒŒ์š”.



profile
์•ˆ๋…•ํ•˜์„ธ์š”.

0๊ฐœ์˜ ๋Œ“๊ธ€