레이블이 specialization인 게시물을 표시합니다. 모든 게시물 표시
레이블이 specialization인 게시물을 표시합니다. 모든 게시물 표시

2015년 10월 15일 목요일

[C++] specialization




#include 
using namespace std;

//1) 기본 템플릿
//primary template(주 템플릿)
template class Stack
{
 T buff[10];
public:
 void push() {cout << "push(T)" << endl;}
};

//2) 부분적인 타입에 특화된 템플릿을 사용하고 싶다면?
//partial specialization(부분 전문화)
template class Stack
{
 T buff[10];
public:
 void push() {cout << "push(T*)" << endl;}
};

//3) 특정 타입에 특화된 템플릿을 사용하고 싶다면?
//specialization(전문화)
template<> class Stack  //를 삭제한다.
{
 char* buff[10];   //T를 특정 타입으로 변경한다.
public:
 void push() {cout << "push(char*)" << endl;}
};

void main()
{
 Stack s1;
 s1.push();  //T
 Stack s2;         //c++에서는 포인터도 타입으로 인지한다.
 s2.push();  //T*
 Stack s3;
 s3.push();  //char*
}

정리 :
모든 타입에 대해서 처리할 수 있는 템플릿을 primary template이라 하고
부분 타입에 대해서 처리할 수 있는 템플릿을 partial specialization 이라 한다.
특정 타입에 대해서 처리할 수 있는 템플릿을 specialization 이라 한다.

왜 필요한가??(template meta programming 의 장점)

예를 들어, 5!(factorial)의 값을 얻으려 할 때,
loop 혹은 recursive code는 run time 에 동작한다.
하지만 class template과 function template 은 compile time에 동작하고
따라서 partial specialization과 specialization 을 이용하면 runtime이 아닌 compile time에 작업을 처리할 수 있다.

2015년 9월 9일 수요일

[C++] Template specialization

Template specialization
: class template 을 arguments에 따라서 customizing 하는 기법



먼저 위 예제의 첫 번째 template 선언처럼
일반적인 template 선언은 primary template 이라 한다.

Specialization 은 2 가지로 나눌 수 있다.
1) T의 포인터 타입을 argument 로 받고 싶다면?
Partial specialization(부분 전문화)를 사용한다.
물론 T&, T&& 도 partial specializtion 을 이용한다.
2) 데이터 타입까지 정해진 argument 로 template 을 정의한다면?
template specialization 을 사용한다.

실제로 위에서 T* 에 대한 template code는 하나지만,
컴파일하면 기계어코드로는 int*, char* 2가지 code가 존재한다.
결국엔 template code 가 아무리 많아도,
컴파일 이후에 만들어지는 기계어 코드는 사용하는 class type의 개수에 의존적이다.





[C++] meta programing

재귀 호출에 관해 template meta programming 을 적용한 예제를 살펴보자. #include using namespace std; int fact(int n){ if(n factorial 연산을 하는 일반적인 재귀 호출 함...