취미생활
[C++11] std::function 템플릿으로 함수 포인터 대체하기 본문
모던 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
}
'컴퓨터 > C++' 카테고리의 다른 글
[C++] 람다 함수로 std::thread 돌리기 (0) | 2023.03.29 |
---|---|
[C++] Map 과 함수 포인터를 이용한 함수 호출 아이디어 (2) | 2022.11.16 |
[C++11] 중괄호로 STL 자료구조 초기화 간편하게 하기 (0) | 2022.11.16 |
[C++] 구조체 비트 필드로 비트 단위 변수 사용하기 (0) | 2022.09.05 |
[C++] 접근 제한자의 범위 (0) | 2020.07.16 |