사용 목적
함수 포인터를 사용하는 것은 좋지만 무엇보다 함수 포인터만으로는 인라인이 불가능하다는 단점이 있습니다.
인라인화는 컴파일 타임에 실행이 되는데 함수 포인터를 사용하면 컴파일러 입장에서는 반환형과 매개변수만으로 어떤 함수를 쓸건지 모르기 때문이에요.
이때 함수 객체를 사용한다면 이러한 단점을 보완하고 인라인화 함으로써 약간의 성능을 끌어올릴 수 있다는 장점이 있습니다.
왜냐하면 객체에서 멤버 함수를 작성한다면 암묵적으로 인라인화 시켜주기 때문입니다.
이 부분에 대한 자세한 내용은 저도 더 공부해서 알아와야할 것 같아요.
방법
class MyFunc1의 멤버 함수 int operator() (int n) 이 바로 함수 객체라고 보시면 되는데, 풀어 쓰자면
MyFunc1.operator()(int n)이 되며
자료형 operator() (매개 변수) { 정의 } 로 작성할 수 있습니다.
int operator()(int n)
void operator()(int n)
float operator()(int n)
void operator()(float n, int n)
...
예시 코드
#include <iostream>
class MyFunc1
{
public:
int operator()(int n) { return n * n * n; }
}test_func1;
class MyFunc2
{
public:
int operator()(int n) { return (n + 3) * 5 / 3; }
}test_func2;
template <typename T>
int calculate(const int arr[], int n, T function) // int calculate(const int arr[], int n, std::function<int(int)> function)
{
int num = function(arr[0]);
for (int i = 1; i < n; ++i)
{
if (function(arr[i]) < num)
{
num = function(arr[i]);
}
}
return num;
}
int main()
{
int arr[7] = { 1, 3, 5, -1, -2, 7, 3 };
std::cout << calculate(arr, 7, test_func1) << std::endl;
std::cout << calculate(arr, 7, test_func2) << std::endl;
return 0;
}
예시코드는 템플릿을 사용하여 자료형을 간단히 T로 표현했습니다.
이로써 int 뿐만 아니라 다양한 자료형이 사용될 수 있겠습니다.
'C,C++' 카테고리의 다른 글
공부하면서 빠트린 것들 끄적끄적 - 얕은 복사 vs 깊은 복사 (0) | 2023.09.25 |
---|---|
함수 포인터 (0) | 2022.11.02 |
함수 템플릿 (0) | 2022.11.01 |
클래스 템플릿 (0) | 2022.11.01 |