ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C++] 함수 포인터
    C++ 2019. 8. 27. 09:01

    함수 포인터

    함수도 변수와 마찬가지로 메모리 어딘가에 저장되어 주소를 가지고 있고, 이 주소를 담기 위한 포인터 변수를 선언할 수 있다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    #include <iostream>
     
    using namespace std;
     
    int func()
    {
        return 5;
    }
     
    int goo()
    {
        return 10;
    }
     
    int main()
    {
        int(*fcnptr)() = func; // 함수 포인터의 선언(함수의 이름은 함수가 저장된 주소를 나타낸다)
     
        cout << fcnptr() << endl;
     
        fcnptr = goo; // 다른 함수로 교체
     
        cout << fcnptr() << endl;
     
        return 0;
    }
     
     
     
     
     
    cs

    함수 포인터의 타입(반환형, 매개변수)은 가리킬 함수의 타입과 일치하여야 한다. 타입이 다르면 에러가 발생한다.

     

     

     

    함수를 다른 함수로 전달

    또한 다른 포인터와 마찬가지로 함수의 주소도 매개변수로 받을 수 있다.

    즉 함수도 변수처럼 다른 함수로 넘길 수 있다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    #include <iostream>
    #include <array>
     
    using namespace std;
     
    bool isEven(const int &number)
    {
        if (number % 2 == 0)
            return true;
        else
            return false;
    }
     
    bool isOdd(const int &number)
    {
        if (number % 2 == 1)
            return true;
        else
            return false;
    }
     
    void printNumbers(const array<int10> &my_array, bool (*check_fcn)(const int&))
    // 함수의 주소를 함수 포인터로 선언된 매개변수로 받는다
    {
        for (auto elem : my_array)
            if (check_fcn(elem) == truecout << elem << " ";
        cout << endl;
    }
    int main()
    {
        array<int10> my_array{ 0,1,2,3,4,5,6,7,8,9};
     
        printNumbers(my_array, isEven); // 함수의 주소(함수의 이름)을 넘긴다
        printNumbers(my_array, isOdd);
     
        return 0;
    }
    cs

     

     

     

    함수 포인터를 축약해서 사용하기

    길고 복잡해 보이는 함수 포인터의 타입을 typedef나 using을 통해 변수의 이름처럼 보이도록 축약해서 사용할 수 있다.

     

    예) typedef

    1
    2
    3
    4
    5
    6
    7
    8
    9
    typedef bool(*check_fcn_t)(const int&);
     
     
    void printNumbers(const array<int10> &my_array, check_fcn_t check_fcn)
    {
        for (auto elem : my_array)
            if (check_fcn(elem) == truecout << elem << " ";
        cout << endl;
    }
    cs

     

    예) using

    1
    2
    3
    4
    5
    6
    7
    8
    using check_fcn_t = bool(*)(const int&);
     
    void printNumbers(const array<int10> &my_array, check_fcn_t check_fcn)
    {
        for (auto elem : my_array)
            if (check_fcn(elem) == truecout << elem << " ";
        cout << endl;
    }
    cs

     

     

     

    C++ 11의 function

    함수 포인터를 사용할 때 bool (*check_fcn)(const int&)과 같은 알아보기 어려운 코드 대신에 functional 라이브러리에 있는 function이라는 클래스를 사용해서 함수 포인터를 선언하면 훨씬 직관적이고 명시적으로 나타낼 수 있다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    #include <iostream>
    #include <array>
    #include <functional> // function의 사용
     
    using namespace std;
     
    bool isEven(const int &number)
    {
        if (number % 2 == 0)
            return true;
        else
            return false;
    }
     
    bool isOdd(const int &number)
    {
        if (number % 2 == 1)
            return true;
        else
            return false;
    }
     
    void printNumbers(const array<int10> &my_array, function<bool(const int&)> check_fcn)
    {
        for (auto elem : my_array)
            if (check_fcn(elem) == truecout << elem << " ";
        cout << endl;
    }
     
    int main()
    {
        array<int10> my_array{ 0,1,2,3,4,5,6,7,8,9};
     
        function<bool(const int&)> fcnptr = isEven; // function 클래스로 함수 포인터 선언
     
        printNumbers(my_array, fcnptr);
     
        fcnptr = isOdd;
     
        printNumbers(my_array, fcnptr);
     
        return 0;
    }
     
    cs

     

     

     

     

     

     

    참고 자료

    https://www.inflearn.com/course/following-c-plus/lecture/14724  (인프런, 홍정모의 따라배우는 C++(7.9 함수 포인터))

Designed by Tistory.