std function bind

À̺¥Æ® ¸Å´ÏÁ®¸¦ ¸¸µé¶§ std::function°ú std::bind¸¦ »ç¿ëÇß´Ù.
ÀÚÁÖ »ç¿ë ÇÏÁö ¾Ê±â ¶§¹®¿¡ ±î¸Ô°í ¼³¸íÀ» ´Ù½Ã ã¾Æ º¸´Â °æ¿ì°¡ ¸¹¾Æ¼­ »ç¿ë¹ýÀ» ³²±ä´Ù.

std::functionÀ» »ç¿ëÇϸé ÇÔ¼ö Æ÷ÀÎÅÍ, ¸â¹ö ÇÔ¼ö¸¦ ½±°Ô º¯¼ö·Î »ç¿ë ÇÒ¼ö ÀÖ´Ù.

std::functionÀº C++ 11ºÎÅÍ Áö¿øÇÑ´Ù.
´ÙÀ½°ú °°Àº ±¸Á¶Ã¼(Ŭ·¡½º)°¡ ÀÖÀ»¶§ ¸â¹ö ÇÔ¼ö¸¦ º¯¼ö·Î ¾î¶»°Ô »ç¿ë ÇÏ´ÂÁö ¾Ë¾Æ º¸ÀÚ.

struct Calc {
    Calc() {}
    int Add(int a, int b)
    {
        return (a + b);
    }
    int Inc(int a)
    {
        return (a++);
    }

};

ÇÊ¿äÇÑ Çì´õ ÆÄÀÏ

ÇÊ¿äÇÑ Çì´õ´Â ´ÙÀ½°ú °°ÀÌ ¼±¾ð ÇÑ´Ù.
#include <functional>

¸â¹ö ÇÔ¼ö Á¤ÀÇ

function °´Ã¼ ¼±¾ð
std::function< ÇÔ¼ö ¸®ÅÏŸÀÔ( ÀÎÀÚŸÀÔ) > function°´Ã¼½Äº°ÀÚ;

std::function<int(int, int)> add2;

¸â¹ö ÇÔ¼ö ÃʱâÈ­

function°´Ã¼½Äº°ÀÚ = ÇÔ¼ö, ÇÔ¼ö ¿ÀºêÁ§Æ®, ¶÷´Ù½Ä, ¸â¹ö ÇÔ¼öµéÀÌ ¿Ã¼ö ÀÖ´Ù.
function°´Ã¼½Äº°ÀÚ = std::bind(&Ŭ·¡½º½Äº°ÀÚ::ÇÔ¼öÀ̸§, ÀνºÅϽº);
ÀÎÀÚ°¡ ÀÖ´Â °æ¿ì´Â bind½Ã placeholder¸¦ »ç¿ëÇÑ´Ù.

add2 = std::bind(&Calc::Add, &calc, _1, _2);;

¸â¹ö ÇÔ¼ö ½ÇÇà

function°´Ã¼½Äº°ÀÚ();

std::cout << "add2 " << add(100, 200) << std::endl;

¿¹Á¦ ¼Ò½º´Â ´ÙÀ½°ú °°´Ù.

#include <iostream>
#include <functional>

void ShowNumber(int n)
{
    std::cout << "ShowNumber " << n << std::endl;
}

struct ShowObjNumber
{
    void operator()(int n) const
    {
        std::cout << "ShowObjNumber " << n << std::endl;
    }
};
//------------------------------------------------------------------------
using AddFunc = std::function<int(int, int)>;
using  namespace  std::placeholders;

struct Calc {
    Calc() {}
    int Add(int a, int b)
    {
        return (a + b);
    }
    int Inc(int a)
    {
        return (a++);
    }

};

//------------------------------------------------------------------------

void Test1()
{
    //ÇÔ¼ö »ç¿ë
    std::function<void(int)> show_func = ShowNumber;
    show_func(100);

    //ÇÔ¼ö ¿ÀºêÁ§Æ® »ç¿ë
    std::function<void(int)> show_func_object = ShowObjNumber();
    show_func_object(77);

    //¶÷´Ù ÇÔ¼ö »ç¿ë
    std::cout << "lambda test\n";
    std::function<void()> show_lambdaTest = []() { ShowNumber(99); };
    show_lambdaTest();

    std::function<void()> pass_parameter = std::bind(ShowNumber, 1234);
    pass_parameter();
}

void Test2()
{
    Calc calc;

    //std::bind »ç¿ë
    AddFunc add = std::bind(&Calc::Add, &calc, std::placeholders::_1, std::placeholders::_2);
    std::cout << "add1 " << add(3, 4) << std::endl;

    //std::bind »ç¿ë placeholders ³×ÀÓÆäÀ̽º »ç¿ë
    std::function<int(int, int)> add2 = std::bind(&Calc::Add, &calc, _1, _2);;
    std::cout << "add2 " << add(100, 200) << std::endl;
    
    //¶÷´Ù »ç¿ë
    std::function<int(int, int)> lfunc = [&](int a, int b) {
        return calc.Add(a, b);
    };
    std::cout << "add3 " << lfunc(123, 1) << std::endl;

    //¸â¹ö ÇÔ¼ö ½ÇÇà
    std::function<int(Calc&, int, int)> add_test3 = &Calc::Add;
    std::cout << "add3 " << add_test3(calc, 1000, 1000) << std::endl;
}

int main()
{
    Test1();
    Test2();
}


Âü°í)
https://programming.vip/docs/c-std-function-example.html
https://develop-dream.tistory.com/55
https://mr-dingo.github.io/c++stl/2018/10/19/stl_function.html