본문 바로가기

Today I Learned

23.02.21 - 함수 객체, 임시 객체, 템플릿

함수 객체

class CPlus
{
public:
	int operator()(int a, int b)
	{
		return a + b;
	}
};

int main()
{
	CPlus plus;
	cout << plus(30, 40) << endl; // 70
}

()연산자를 오버로딩해서 객체를 함수처럼 사용할 수 있다.

함수 객체는 클래스 선언부 선언되므로 인라인 함수이다. 그러므로 호출에 들어가는 오버헤드를 줄여 속도를 높일 수 있다.

 

임시 객체

int main()
{
	cout << CPlus()(30,40); // 70
}

이렇게 함수 객체를 사용할 수도 있다. 이것을 임시 객체라고 하며 CPlus의 객체를 따로 선언할 필요가 없다.

하지만 임시 객체는 한 줄이 지나면 바로 사라진다. 

 

 

 

템플릿

함수나 클래스가 각기 다른 자료형에서도 동작할 수 있게 하는 문법이다.

template<typename T>
T Add(T a, T b)
{
	return a + b;
}

int main()
{
	cout << Add<int>(3,5); //8
        cout << Add<float>(1.12f,2.24f); // 3.36f
 }

Add뒤에 <자료형>이 붙는 것은 필수는 아니다. 하지만 명시적으로 표현하기 위해 붙여주는 것이 좋다.

 

template<>
char* Add(char* a, char* b)
{
	int		iLength = strlen(a) + strlen(b);

	char*	pString = new char[iLength + 1];

	strcpy_s(pString, iLength + 1, a);
	strcat_s(pString, iLength + 1, b);

	return pString;
}

템플릿이 특정 자료형에 대해 예외적으로 동작하게 하고 싶을 때 템플릿 특수화를 이용할 수 있다.

위는 함수 템플릿 Add의 자료형이 char*일 때 두 문자열을 결합하도록 템플릿 특수화를 한 것이다.

 

template<typename T1, typename T2, typename T3>
T3 Add(T1 a, T2 b)
{
	return a + b;
}

템플릿에서 사용하는 자료형을 두 개 이상으로 할 수 있다. 보통 한개면 단항, 두개 이상이면 이항 템플릿으로 부른다.