1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
#include <iostream>
#include <time.h>
#include <Windows.h>
using exe_ = void(*)();
//typedef void(*exe_)();
void execute() {
printf("개굴");
}
void timer(int time, exe_) {
exe_ exe = execute;
while (time) {
Sleep(3000);
exe();
}
}
int main()
{
timer(30, execute);
}
|
cs |
함수 포인터는, 생각만큼 자주 사용하는 기법이 아니라서 깜빡 잊어버리기 쉽다.
위 코드를 잘 살펴보면 C++ 의 기본에 대해서 다시 한번 짚어 볼 수 있다.
using 으로 exe_ 라는 '형' 을 재 정의 하는것이다.
typedef 등으로 사용할 수 도 있지만 필자는 '모던' C++ 을 지향하기에 typedef 가 아닌 using 을 쓰는걸 권장한다.
※ 물론 이전 코드를 수정해야 할 일도 있으니 typedef의 사용법은 알아두는것이 좋다.
exe_ 형의 exe 인스턴스를 timer 함수 내에서 만드는것을 확인할 수 있다.
그렇게 만든 exe 인스턴스에 execute 의 주소를 할당하여 while 문 내에서 exe() 함수형으로 사용하는 것이다.
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
|
#include <iostream>
using A = int(*)(int, int);
int second(int a, int b) {
int result = a + b;
return result;
}
int therd(int a, int b) {
return a - b;
}
int result(int(*hi)(int, int)) {
int a = hi(10, 20);
return a;
}
int main()
{
std::cout << result(second) << std::endl;
std::cout << result(therd) << std::endl;
}
|
cs |
위 코드에서도 불필요한 부분을 알 수 있는데, int(*hi)(int,int) 와 같이 쓴 부분을
'A' 로 대체할 수 있다.
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
|
#include <iostream>
using A = int(*)(int, int);
int second(int a, int b) {
int result = a + b;
return result;
}
int therd(int a, int b) {
return a - b;
}
int result(A hi) {
int a = hi(10, 20);
return a;
}
int main()
{
std::cout << result(second) << std::endl;
std::cout << result(therd) << std::endl;
}
|
cs |
개인적으로 함수포인터는 다소 조심하게 사용해야 한다고 생각한다.
함수 사용보다 일반적이지 않으며, 잘 사용할 경우 가독성증대와 로직을 깔끔하게 만들수도 있지만.
남발할 경우 가독성이 떨어진다.
+ C++11 에 추가되었으며 C++20 에서 개정된
std::function, std::bind 를 사용하면
함수 포인터를 보다 직관적으로 사용할 수 있다.
특히 bind 의 경우에는 std::placeholder 와 함께 유용하게 사용될 수 있으니 익혀 두도록 하자.
'Programming > C++' 카테고리의 다른 글
[C++] C4819 Warning 해결 방법, 한글 깨짐 문제 (0) | 2020.12.03 |
---|---|
[C++] constexpr 사용하기. (0) | 2020.11.22 |
[C++] C++ 이 끔찍한 언어라 욕을 먹는 이유. (0) | 2020.09.30 |
[C++] system, WinExec 함수 출력값 받는법. (0) | 2020.08.17 |
어떻게 특정 .h 가 dll, lib 와 매칭되는지 알 수 있나? (0) | 2020.07.14 |