programming2010. 12. 8. 18:06


템플릿 특화(Template specialize)를 이용한 BOOST_STATIC_ASSERT
BOOST_STATIC_ASSERT 은 컴파일 타임에 ASSERT 를 수행한다.
이 기능을 템플릿 특화를 이용하여 간단하게 만들어 본다.

template <bool> class ComplieTimeAssert;
template <> class ComplieTimeAssert<true> {};   //bool 템플릿을 true 만 특화 시킨다.

#define COMPLIETIME_ASSERT(expr) (ComplieTimeAssert<expr>())

void main(void)
{	    
    COMPLIETIME_ASSERT(true);
    //COMPLIETIME_ASSERT(false);
}

COMPLIETIME_ASSERT(true); 가 있을 경우 성공적으로 컴파일 된다.
COMPLIETIME_ASSERT(false); 주석을 풀어서 컴파일 할 경우 다음과 같은 오류 메시지가 발생한다.

error C2514: 'ComplieTimeAssert<__formal>' : 클래스에 생성자가 없습니다.
with
[
__formal=false
]
컴파일 중인 클래스 템플릿 인스턴스화 'ComplieTimeAssert<__formal>'에 대한 참조를 확인하십시오.
with
[
__formal=false
]

템플릿 특화는 이런 용도 보다는 라이브러리 제작시 확장성, 융통성 을 증가시킬수 있다.
그리고 컴파일 타임에 결정이 되므로 빈번하게 연산되는 작업에도 많이 사용한다.


factorial 로직을 함수, 템플릿으로 구현해보면 아래와 같다.
돌일한 결과지만 함수로 만든경우 런타임시 값이 계산 되고, 템플릿으로 구현시 컴파일 타임에 값이 계산된다.

#include "stdafx.h"
#include 

template 
struct factorial
{
	enum {value = n * factorial::value};
};

template<> struct factorial<1>
{
	enum {value = 1};
};

unsigned short factorial_func(unsigned short n)
{
	if(n <= 1) return 1;
	return n * factorial_func(n-1);
}

int _tmain(int argc, _TCHAR* argv[])
{
	std::cout << factorial<4>::value << std::endl;	
	std::cout << factorial_func(4)   << std::endl;	
	return 0;
}

Posted by 상현달