템플릿으로 함수객체, 람다 표현식을 받을때 인라인화


template<class T>
void Sort(int* x, int sz, T cmp)
{
	// ...
}

int main()
{
	// 템플릿 인자로 글로벌 함수를 보냈기 때문에 인라인화 된다.
	Sort(x, 10, [](int a, int b) { return a > b; });
}

Virtual 오버라이드 한 함수는 인라인화 되지 않는다.

인라인 함수를 함수 포인터에 주소를 담아 사용하면 인라인화 될 수 없다.

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); // 호출
}

함수 객체를 이용해서 인라인 처리

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);
}