취미생활

[C++11] std::function 템플릿으로 함수 포인터 대체하기 본문

컴퓨터/C++

[C++11] std::function 템플릿으로 함수 포인터 대체하기

달다달아 2022. 11. 16. 12:35

모던 C++ 에서는 함수포인터를 템플릿으로 관리한다.

 

#include <iostream>
#include <functional>

void greet()
{
    std::cout << "hello world!" << '\n';
}

int main()
{
    std::function<void()> a = &greet; // Modern C++ style
    void (*b)() = &greet; // C-style
    a();
    b();
}

개인적으로 함수포인터를 자주 사용하는 프로젝트를 해본 건 아니지만,

 

C 형식의 함수포인터는 선언 부분에서 가끔 꼬여서 문제가 많이 발생했었다.

 

자주 사용하는 게 아니라서 계속 선언 방식이 헷갈려 구글링을 해야했는데 C++ 11 부터는 그럴 필요가 없어졌다.

 

std::function 템플릿 하나면 함수 포인터를 사용할 수 있기에 이젠 더이상 함수 포인터가 두렵지가 않다.

 

 

헤더 파일

#include <functional>

사용 방법

std::function<리턴 타입 (함수 인자)> 변수 이름 = &함수

 

 

주의해야 할 점은 function 템플릿 사용 시 리턴 타입, 함수 인자의 자료형 개수가 지정할 함수와 동일해야 한다.

 

 

활용 예시

 

[C++] Map 과 함수 포인터를 이용한 함수 호출 아이디어

중국에 출장을 와서 마라탕도 먹어보고.. 근로기준법에 적혀있는 근무시간도 어겨가면서 일을 하면서 프로그래밍도 해보고있는데, 별 생각없이 코드를 보다가 그런 생각이 들었다. 아래 코드는

moonfac.tistory.com

 

위 글은 내가 중국 출장 중에 실제로 겪었던 실제 업무를 바탕으로 쓴 글이다.

 

문자열에 매칭되는 함수를 실행하는 코드를 만드는 일이었는데

 

기존에는 if-else 문을 통해 문자열 비교를 통해 함수를 실행했다.

 

이에 대한 아이디어로 STL map, 함수포인터를 사용해 함수를 호출하는 방식을 생각해냈었다.

 

하지만, C++ 11 부터는 함수포인터를 굳이 저런 방식으로 사용할 필요가 없어졌기에 아래와 같이 수정할 수 있을 듯하다.

 

int main()
{
    std::map<std::string, std::function<void()>> a; // function template
    std::map<std::string, void (*)(void)> b; // function pointer
}
Comments