[C, C++] Header와 템플릿의 명시적 특수화
C, C++에서 Template라는 개념은 <int>, <string>, <char> 등의 다양한 자료형의 함수를 두 번 생산하지 않고, 재사용을 한다는 장점을 통해, 개발 인력의 최소화로 긍정적인 부분을 보여준다고 할 수 있습니다.
이러한 Template는
using namespace std;
template <typename T>
class dd{
}
int main(){
}
이같은 꼴로 사용할 수 있습니다.
이러한 템플릿에서 명시적 특수화에 대해 잠시 소개하려고 합니다.
Explicit Specialization은 전체 특수화를 기본 특징으로 갖는 언어를 말합니다.
어려운 개념은 아닌데, 잘못 사용하면, 어려워지는 개념이 이 부분이 아닐까 싶습니다.
template <typename T> class Invalid {
};
InVaild<double> x1; // Invalid<double> 인스턴스화 시킴
template<>
class Invalid<double>; // 에러: Invalid<double> 이미 인스턴스화 됨
위험하게 구성된 코드입니다. 흔히들 작업하다보면, 이와 같은 쓰레기 코드를 만들 수 있는데, 참조수준의 문제로 시스템에 중대한 오류를 발생시킬 수 있습니다.
기본적인 원칙을 구하고 사용하자.
template <typename T>
class Invalid {
void aa();
};
void Invalid<T>::aa()
{
}
이의 경우, void 형의 aa() 함수를 선언하고 정의한 예시입니다.
기본적인 이의 구조는 당연한 Template를 생성하는 기본 원칙입니다.
template <typename T>
class Invalid {
void aa(T data);
};
void Invalid<T>::aa(T data)
{
}
template <>
void Invalid<char>::aa(char data)
{
}
(명시적 특수화)
T보다 특수화가 앞서 선언될 수 없다는 점을 명확히 할 필요가 있습니다.
아래는 가능한 사례를 몇 개 소개해드리고자 합니다.
class Invalid {
void aa(T data1, D data2);
};
void Invalid<T>::aa(T data1, D data2)
{
}
template <char, int>
void Invalid<char, int>::aa(char data1, int data2)
{
}
(명시적 특수화)
이의 경우에는 명시적 특수화에서 오류가 날 수밖에 없습니다.
template <char, int>라고 쓴 부분은 template 함수를 생성하는 자료형이 와야 맞는데 General Data Type이 오기 때문에 오류가 날 수밖에 없습니다.
class test{
public:
void aa(T data1, D data2);
void test<T, D>::aa(T data1, D data2){
std::cout << "T, D";
std::cout << data1 << "," << data2;
}
void test<char, int>::aa(char data1, int data2)
{
std::cout << "T, D";
std::cout << std::endl;
std::cout << data1 << "," << data2;
}
aaaa.aa(1.22, 1);
bbbb.aa('a', 1);
출력
T, D
1.22,1
T, D
a,1
1. 추천 사이트
'소프트웨어(SW) > GNU - C, C++' 카테고리의 다른 글
[C++(GTKmm)] Anjuta에서 GTKmm 시작하기 (7) | 2019.07.24 |
---|---|
[C, C++] double의 비교 (9) | 2014.10.18 |
[G++/C++]: std::to_string -> compiler error "not a member of std" - 오류 (12) | 2014.10.12 |
[C++] String 함수 - 문자열 비교 방법 (9) | 2014.10.11 |
[C, C++] 멀티플렛폼 구현 - 원리 (9) | 2014.10.10 |