템플릿으로 함수객체, 람다 표현식을 받을때 인라인화
- 함수 포인터(인스턴스)의 경우는 인라인화 안됨.
template<class T>
void Sort(int* x, int sz, T cmp)
{
// ...
}
int main()
{
// 템플릿 인자로 글로벌 함수를 보냈기 때문에 인라인화 된다.
Sort(x, 10, [](int a, int b) { return a > b; });
}
Virtual 오버라이드 한 함수는 인라인화 되지 않는다.
인라인 함수를 함수 포인터에 주소를 담아 사용하면 인라인화 될 수 없다.
- 모든 함수는 signature가 같다면 같은 타입이다.
- 그렇기 때문에 함수 객체는 어떤 함수가 올지 알 수 없기 때문에 인라인 할 수 없다
int Add1(int a, int b) {}
inline int Add2(int a, int b) {}
int main()
{
int ret1 = add1(1, 2); // 호출
int ret2 = add2(1, 2); // 치환
int(*f)(int, int) = &add2;
f(1, 2); // 호출
}
함수 객체를 이용해서 인라인 처리
- 함수 객체의 경우 함수 포인터와 달리 signature가 같아도 객체가 다르면 다른 타입이기 때문에, 이를 이용하면 인라인화 할 수 있다.
struct Less
{
inline bool operator()(int a, int b) {}
}
struct Greater
{
inline bool operator()(int a, int b) {}
}
template<class T>
void Sort(int* x, int sz, T cmp)
{
for (int i = 0; i < sz-1; ++i)
{
for (int j = i + 1; j < sz; ++j)
{
if ( cmp(x[i], x[j]) )
std::swap(x[i], x[j]);
}
}
}
int main()
{
int x[10] = {1, 3, 5, 7, 9, 2, 4, 6, 8, 10};
Less f1; f1(1, 2); sort(x, 10, f1);
Greater f2; f2(1, 2); sort(x, 10, f2);
}