본문 바로가기
Programing_Language/C++

c++ 함수 포인터

by neohtux 2020. 12. 16.
728x90

C와 C++의 함수포인터

C에서의 함수포인터 타입 재정의

  • 함수 역시 주소를 가지고 있기 때문 포인터와 마찬가지로 함수를 가리키는 포인터를 만들 수 있다.
//짝수인지 반환 함수
bool isEven(const int& number)
{
  return (number % 2) ? false : true;
}

//함수포인터 타입 재정의
typedef bool(*check_func)(const int&);

//배열의 짝수들 출력
void printEvenNumber(const array<int,10>& my_arr, check_func = isEven)
{
  for (const auto &e : my_arr)
    {
        if (isEven(e)) cout << e << ' ';
    }
    cout << '\n';
}

int main(void)
{
  array<int, 10> my_arr{0,1,2,3,4,5,6,7,8,9};
  printEvenNumber(my_arr,isEven);
  return 0;
}


C++11 에서 타입 앨리어스(alias)

  • typedef를 통해 타입을 재정의 하는것 보다 using을 사용하여 가독성이 좋아졌다.
//타입 앨리어스
using check_func_t = bool(*)(const int&)

void printEvenNumber(const array<int,10>& my_arr, check_func_t =isEven)
{
    for (const auto &e : my_arr)
    {
        if (isEven(e)) cout << e << ' ';
    }
    cout << '\n';
}

int main(void)
{
  array<int, 10> my_arr{0,1,2,3,4,5,6,7,8,9};
  printEvenNumber(my_arr,isEven);
  return 0;
}


C++17 에서 지원하는 functional

  • 함수 포인터를 지원하는 클래스의 등장으로 객체 생성이 가능하다.
  • functional<type> _obj;
#include<functional> // 헤더를 선언 해주어야 한다.

//functional 을 사용하기위해 매개변수 타입도 맞춰준다.
void printEvenNumber(const array<int,10>& my_arr, function<bool(const int&)> fcnptr =isEven)
{
    for (const auto &e : my_arr)
    {
        if (isEven(e)) cout << e << ' ';
    }
    cout << '\n';
}
int main(void)
{
    //functional 정의
    // fcnptr 은 <type>의 isEven 함수를 가리키 포인터가 된다
    function<bool(const int&)> fcnptr = isEven;

    array<int, 10> my_arr{ 0,1,2,3,4,5,6,7,8,9 };

    printEvenNumber(my_arr,fcnptr);



    return 0;
}
300x250

댓글