[STL][functional] std::bind, std::function

2023. 6. 8. 00:15ยทํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด/C++ ์‘์šฉ

 

 

# std::bind, std::function

std::bind ํ•จ์ˆ˜ ํ…œํ”Œ๋ฆฟ์€ ํ•จ์ˆ˜๋‚˜ ํ•จ์ˆ˜ ๊ฐ์ฒด๋ฅผ ๋” ์ž‘์€ ์ธ์ž ๋ฆฌ์ŠคํŠธ๋กœ ๋ฐ”์ธ๋”ฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ํ•จ์ˆ˜๋‚˜ ํ•จ์ˆ˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์ด๋Š” ๋ฏธ๋ฆฌ ์ง€์ •ํ•œ ์ธ์ž ๊ฐ’์ด๋‚˜ ์ธ์ž ์œ„์น˜์— ๊ฐ’์„ ๊ณ ์ •์‹œํ‚ค๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค. std::bind๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ธ์ž๋ฅผ ์ผ๋ถ€ ๊ณ ์ •ํ•˜๊ฑฐ๋‚˜ ์ˆœ์„œ๋ฅผ ๋ณ€๊ฒฝํ•˜์—ฌ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ์œ ์—ฐ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.

std::function์€ ํ•จ์ˆ˜ ํฌ์ธํ„ฐ์™€ ๋น„์Šทํ•œ ๊ฐœ๋…์œผ๋กœ, ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ํ•จ์ˆ˜ ๊ฐ์ฒด(wrapper)์ด๋‹ค. ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜์˜ ํ•จ์ˆ˜๋‚˜ ํ•จ์ˆ˜ ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•˜๊ณ  ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํŠนํžˆ ๋Ÿฐํƒ€์ž„ ์‹œ์— ๋‹ค๋ฅธ ํ•จ์ˆ˜๋‚˜ ํ•จ์ˆ˜ ๊ฐ์ฒด๋ฅผ ํ• ๋‹นํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

std::bind์™€ std::function์€ ์„œ๋กœ ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š”๋‹ค. ํŠนํžˆ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ๊ฐ•์ ์„ ๋ณด์ธ๋‹ค.

#include <algorithm>
#include <functional>
#include <iostream>
#include <iterator>
#include <vector>

double divMe(double a, double b){
  return double(a/b);
}

using namespace std::placeholders;

int main(){

  std::cout << std::endl;

  // invoking the function object directly
  std::cout << "1/2.0= " << std::bind(divMe, 1, 2.0)() << std::endl;

  // placeholders for both arguments
  std::function<double(double, double)> myDivBindPlaceholder= std::bind(divMe, _1, _2);
  std::cout << "1/2.0= " << myDivBindPlaceholder(1, 2.0) << std::endl;

  // placeholders for both arguments, swap the arguments
  std::function<double(double, double)> myDivBindPlaceholderSwap= std::bind(divMe, _2, _1);
  std::cout << "1/2.0= " << myDivBindPlaceholderSwap(2.0, 1) << std::endl;

  // placeholder for the first argument
  std::function<double(double)> myDivBind1St= std::bind(divMe, _1, 2.0);
  std::cout<< "1/2.0= " << myDivBind1St(1) << std::endl;

  // placeholder for the second argument
  std::function<double(double)> myDivBind2Nd= std::bind(divMe, 1.0, _1);
  std::cout << "1/2.0= " << myDivBind2Nd(2.0) << std::endl;

  std::cout << std::endl;

}

/*
1/2.0= 0.5
1/2.0= 0.5
1/2.0= 0.5
1/2.0= 0.5
1/2.0= 0.5
*/

 

std::bind์˜ ํŠน์ง•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

- ์ธ์ˆ˜๋ฅผ ์›ํ•˜๋Š” ์œ„์น˜์— ๋ฐ”์ธ๋”ฉํ•  ์ˆ˜ ์žˆ๋‹ค.
- ์ธ์ˆ˜์˜ ์ˆœ์„œ๋ฅผ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค.
- ์ธ์ˆ˜์— ์ž๋ฆฌ ํ‘œ์‹œ์ž(placeholder)๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
- ํ•จ์ˆ˜์˜ ์ผ๋ถ€๋ถ„๋งŒ ํ‰๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค.
- ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ํ•จ์ˆ˜ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  std::function์— ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

 

std::function์€ ์ž„์˜์˜ ์ฝœ๋Ÿฌ๋ธ”(ํ•จ์ˆ˜ ํ˜•ํƒœ์˜ ํ˜ธ์ถœ์ž)์„ ๋ณ€์ˆ˜์— ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฝœ๋Ÿฌ๋ธ”์€ ์ผ๋ฐ˜ ํ•จ์ˆ˜๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋žŒ๋‹ค ํ•จ์ˆ˜ ํ˜น์€ ํ•จ์ˆ˜ ์˜ค๋ธŒ์ ํŠธ์ผ ์ˆ˜๋„ ์žˆ๋‹ค.

#include <cmath>
#include <functional>
#include <iostream>
#include <map>

int main(){

  std::cout << std::endl;

  // dispatch table
  std::map< const char , std::function<double(double, double)> > dispTable;
  dispTable.insert( std::make_pair('+', [](double a, double b){ return a + b;}));
  dispTable.insert( std::make_pair('-', [](double a, double b){ return a - b;}));
  dispTable.insert( std::make_pair('*', [](double a, double b){ return a * b;}));
  dispTable.insert( std::make_pair('/', [](double a, double b){ return a / b;}));

  // do the math
  std::cout << "3.5 + 4.5= " << dispTable['+'](3.5, 4.5) << std::endl;
  std::cout << "3.5 - 4.5= " << dispTable['-'](3.5, 4.5) << std::endl;
  std::cout << "3.5 * 4.5= " << dispTable['*'](3.5, 4.5) << std::endl;
  std::cout << "3.5 / 4.5= " << dispTable['/'](3.5, 4.5) << std::endl;

  // add a new operation
  dispTable.insert( std::make_pair('^', [](double a, double b){ return std::pow(a, b); }));
  std::cout << "3.5 ^ 4.5= " << dispTable['^'](3.5, 4.5) << std::endl;

  std::cout << std::endl;

};

/*
3.5 + 4.5= 8
3.5 - 4.5= -1
3.5 * 4.5= 15.75
3.5 / 4.5= 0.777778
3.5 ^ 4.5= 280.741
*/

 

 

 

์ €์ž‘์žํ‘œ์‹œ (์ƒˆ์ฐฝ์—ด๋ฆผ)

'ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด > C++ ์‘์šฉ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[STL] ์Šค๋งˆํŠธํฌ์ธํ„ฐ(std::unique_ptr, std::shared_ptr, std::weak_ptr)  (3) 2023.08.05
[STL] std::tuple, std::make_tuple, std::tie, std::ignore  (1) 2023.08.04
[STL] utility : minmax, move, forward, swap  (1) 2023.06.04
vcpkg๋ฅผ ์“ฐ์ž  (0) 2023.03.19
std::thread์™€ std::async  (0) 2023.01.14
'ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด/C++ ์‘์šฉ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [STL] ์Šค๋งˆํŠธํฌ์ธํ„ฐ(std::unique_ptr, std::shared_ptr, std::weak_ptr)
  • [STL] std::tuple, std::make_tuple, std::tie, std::ignore
  • [STL] utility : minmax, move, forward, swap
  • vcpkg๋ฅผ ์“ฐ์ž
์„œ์•„๋ž‘๐Ÿ˜ƒ
์„œ์•„๋ž‘๐Ÿ˜ƒ
Just Do It๐Ÿ’ช
  • ์„œ์•„๋ž‘๐Ÿ˜ƒ
    G-Stack
    ์„œ์•„๋ž‘๐Ÿ˜ƒ
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ์ „์ฒด๋ณด๊ธฐ (144)
      • ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด (78)
        • C++ ๊ธฐ์ดˆ (28)
        • C++ ์‘์šฉ (18)
        • Python (18)
        • JavaScript & NodeJS (0)
        • Go (12)
        • React & NextJS (2)
        • Java (0)
      • AI (2)
      • ์ปดํ“จํ„ฐ ๊ตฌ์กฐ & ์šด์˜์ฒด์ œ (31)
      • ์•Œ๊ณ ๋ฆฌ์ฆ˜ (12)
      • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค (5)
      • ๋„คํŠธ์›Œํฌ (3)
      • ๋””์ž์ธํŒจํ„ด (5)
      • ์„œ๋น„์Šค & ํˆด (7)
      • ํŠธ๋ Œ๋“œ&์ด์Šˆ (1)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ๋งํฌ

  • ๊ณต์ง€์‚ฌํ•ญ

    • G์Šคํƒ์˜ ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ
  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    ์ปดํ“จํ„ฐ
    ๋ฉ”๋ชจ๋ฆฌ
    ํŒŒ์ผ์ž…์ถœ๋ ฅ
    pointer
    ํ•˜๋“œ๋””์Šคํฌ
    init
    ํฌ์ธํ„ฐ
    ์ƒ์†
    ํŒจํ‚ค์ง€
    c
    c++
    go
    ๊ฐ€์ƒ๋ฉ”๋ชจ๋ฆฌ
    ๋””์ž์ธํŒจํ„ด
    ํŒŒ์ด์ฌ
    ํ•จ์ˆ˜
    component
    ๋ฐ˜๋ณต๋ฌธ
    ์•Œ๊ณ ๋ฆฌ์ฆ˜
    ๋ณ€์ˆ˜
    ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค
    STD
    ๋ฐฐ์—ด
    fork
    ์Šคํƒ
    cpu
    ์žฌ๊ท€
    RAM
    Thread
    ์กฐ๊ฑด๋ฌธ
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.6
์„œ์•„๋ž‘๐Ÿ˜ƒ
[STL][functional] std::bind, std::function
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”