STL 알고리즘에 데이터를 전달하기 위해서는 다음과 같은 방법을 사용할 수 있습니다.

  1. 함수 포인터
  2. 함수 객체
  3. 람다 표현식

  • 많은 STL 알고리즘이 데이터를 처리하기 위해 매개변수로 함수 객체(function object)를 받아들입니다. * 펑크터(functor)라고도 불리는 함수 객체는 호출 연산자(())와 함께 사용할 수 있는 객체를 의미합니다.
  • 이러한 함수 객체는 우선 타입을 선언하고, 해당 클래스에서 호출 연산자(())를 오버로딩하여 구현하게 됩니다.

함수 포인터

  • 함수를 저장하는 포인터
  • 함수 포인터를 주고 받거나, 함수 포인터로 함수를 호출 할 수 있다.
void (*fp)();    // 반환값과 매개변수가 없는 함수 포인터 fp 선언
//↓ 반환값 자료형
void (*fp)();    // 반환값과 매개변수가 없는 함수 포인터 fp 정의
//     ↑   ↖ 매개변수가 없음
// 함수 포인터 이름
int (*fp)(int, int);    // int형 반환값, int형 매개변수 두 개가 있는 함수 포인터 fp 선언
//↓ 반환값 자료형
int (*fp)(int, int);    // int형 반환값, int형 매개변수 두 개가 있는 함수 포인터 fp 선언
//    ↑      ↖ int형 매개변수 두 개
// 함수 포인터 이름
typedef int(*Funcptr)(int, int);
int(*Fptr)(int, int);


int calcultor(int first, int second, Funcptr func)
{
    return func(first, second);
}


int add(int a, int b){  return a + b;}

int minus(int a, int b){    return a - b;}


Funcptr SelectFunc(const int& iSelect)
{
    Funcptr calc = 0;
  //static Funcptr calc = 0;  //전역으로 하면, 반환유형을 Funcptr& 할수가 있고, 매번 생성 안됨

    switch (iSelect)
    {
    case 0: 
    {
        calc = add;
        break;
    }
    case 1:
    {
        calc = minus;
    }
    default:
        break;
    }
    return calc;
}

void hello(){
    std::cout << "hello" << std::endl;
}

int main()
{
    void (*B)();
    B = hello;
    B();

    int iValue1 = 11;
    int iValue2 = 2;

    int (*C)(int, int);
    C = add;
    std::cout << C(iValue1, iValue2) << std::endl;

///////////////////////////////////////////////////////////

    Funcptr D = SelectFunc(0);  
    std::cout << D(iValue1, iValue2) << std::endl;  //13

    Funcptr E = SelectFunc(1);
    std::cout << E(iValue1, iValue2) << std::endl;  //9

    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
    return 0;
}
}

'프로그래밍 > C++' 카테고리의 다른 글

함수 객체  (0) 2019.04.29
이동 시멘틱  (0) 2019.04.29
스마트포인터  (0) 2019.04.29
템플릿 <template>  (0) 2019.04.29
OOP 객체지향프로그래밍  (0) 2019.04.29

+ Recent posts