jobGuid 꽃미남 프로그래머 "Pope Kim"님의 이론이나 수학에 치우치지 않고 실무에 곧바로 쓸 수 있는 실용적인 셰이더 프로그래밍 입문서 #겁나친절 jobGuid "1판의내용"에 "새로바뀐북미게임업계분위기"와 "비자관련정보", "1판을 기반으로 북미취업에 성공하신 분들의 생생한 경험담"을 담았습니다. 3ds Max를 사용해서 게임용 3D 캐릭터를 셋업하는 방법
이를 위해 오랜 실무를 경험해 온 저자의 고급 노하우들이 공개
위 내용은 GameDevForever의 저자분들의 홍보를 위하여 운영진 자체적으로 올린 광고이며 일체의 수익이 없습니다.(밥좀사줘요~)
Posted by 친절한티스

타입은 다른데 같은 작업을 하는 클래스나 함수를 구현을 할때 템플릿을 사용합니다. 아래와 같이 말이죠.


template<typename T>
class CFoo
{
public:
	T Add(T lhs, T rhs)
	{
		return lhs + rhs;
	}
};

int _tmain(int argc, _TCHAR* argv[])
{
	CFoo<int> integer;
	std::cout << integer.Add(3, 5) << std::endl;

	CFoo<float> floating;
	std::cout << floating.Add(2.5f, 8.2f) << std::endl;

	return 0;
}



여기까지는 계획대로 잘 되는거 같습니다. 그렇다면 Add 함수에 아래와 같이 문자열을 넣어서 두 문자열이 합쳐지게 만드려면 어떨까요?


CFoo<char*> szStr;
std::cout << szStr.Add("Hello, ", "World!!") << std::endl;


결과는 error C2110: '+' : 두 포인터를 더할 수 없습니다. 라는 메시지와 함께 에러가 나버립니다. 두 문자열이 합쳐지게 하려면 char* 타입용 CFooCharPointer 클래스를 따로 구현해야 할까요? 아니면 클래스 전체를 구현하기는 귀찮으니 char* 인자를 받는 AddCharPointer 함수만 추가로 구현해줄까요? 


비슷한 일을 하는 클래스를 또 만드는 것도, 다른 타입의 템플릿 클래스에서는 굳이 사용안할 멤버 함수를 추가하는 것도, 둘다 그리 좋은 모습은 아닙니다. 이런 상황의 해결책으로 템플릿 특수화 기능을 사용하면 됩니다. 특정 타입에서만 다르게 동작하는 함수를 만들수 있는 것이죠. 위의 상황에서 int나 float 같은 일반적인 타입에서는 기존에 정의한 Add 함수대로 동작하고, char* 같은 예외 타입이 들어오면 특수화 시킨 함수를 호출 시키게 하면 되는 것입니다.


template<typename T>
class CFoo
{
public:
	T Add(T lhs, T rhs)
	{
		return lhs + rhs;
	}
};

// char* 타입용 특수화 함수
template<> char* CFoo<char*>::Add(char* lhs, char* rhs)
{
	char *sz = new char[128];
	memset(sz, 0, sizeof(sz));
	strcat(sz, lhs);
	strcat(sz, rhs);
	return sz;
}

int _tmain(int argc, _TCHAR* argv[])
{
	CFoo<int> integer;
	std::cout << integer.Add(3, 5) << std::endl;

	CFoo<float> floating;
	std::cout << floating.Add(2.5f, 8.2f) << std::endl;

	CFoo<char*> szStr;
	char *resultString = szStr.Add("Hello, ", "World!!");
	std::cout << resultString << std::endl;
	delete[] resultString;

	return 0;
}

CFoo에 위와 같이 char* 타입에 대해 함수를 재정의 해줍니다. 이렇게 할 경우 char* 타입으로 템플릿을 생성했을 경우 Add 함수를 호출 하면, 특수화된 Add 함수가 호출되고, 결과는 아래와 같이 원하는대로 출력되는 것을 확인할 수 있습니다.



참고 : https://msdn.microsoft.com/ko-kr/library/c401y1kb.aspx

PS : CFoo<std::string> 을 사용하면 char* 특수화를 안해도되지만, 예를 위해 위와 같이 샘플 코드를 작성해보았습니다.

댓글을 달아 주세요

  1. Favicon of http://gamedevforever.com 끼로 2015.02.05 17:45 신고  댓글주소  수정/삭제  댓글쓰기

    티스형 최고.. 이제 여긴 티스형 개인블로그가 되버린듯 ㅠㅠ



티스토리 툴바