템플릿 인자
Programming/C++ 2012. 10. 16. 23:42 |템플릿을 정의할 때 결정되지 않은 자료형을 의미하는 용도로 사용되는 T 또는 T1, T2와 같은 문자를 가리켜 '템플릿 매개변수' 라 한다.
그리고 템플릿 매개변수에 전달되는 자료형 정보를 가리켜 '템플릿 인자' 라 한다.
템플릿 매개변수에는 변수의 선언이 올 수 있다.
아래의 예제를 보면, 템플릿 매개변수의 선언에 마치 함수처럼 변수의 선언이 등장했다.
SimpleArray<int, 5> i5arr;
SimpleArray<double, 7> d7arr;
위의 두 문장에서 템플릿 매개변수 len에 전달된 인자 5와 7은 해당 템플릿 클래스에서 상수처럼 사용된다.
즉, len은 각각 5, 7로 치환되어, 컴파일러에 의해 SimpleArray<int, 5>, SimpleArray(double, 7> 형 템플릿 클래스가 각각 생성된다.
※ 물론 생성자를 이용해도 충분히 구현 가능하다. 그리고 이것이 더 현실적이고, 좋은 방법임에도 틀림이 없다.
이 예제에서 주목할 사실
-> SimpleArray<int, 5>와 SimpleArray<int, 7> 은 서로 다른 형(type)이다.
ex) i5arr1 = i7arr1; //컴파일 error!
이렇듯, 템플릿 매개변수에 값을 전달받을 수 있는 변수를 선언하면, 변수에 전달되는 상수를 통해서 서로 다른 형의 클래스가 생성되게 할 수 있다.
따라서 위 예제의 경우, 길이가 다른 두 배열 객체간의 대입 및 복사에 대한 부분을 신경 쓰지 않아도 된다. 자료형도 같고 길이도 같은 배열 객체에 대해서만 대입 및 복사가 허용되니 말이다.
※ 만약에 생성자를 이용해서 배열의 길이를 결정하게 했다면, 길이가 같은 배열에 대해서는 대입을 허용하기 위해서 추가적인 코드의 삽입이 불가피하며, 이러한 추가적인 코드는 대입 및 복사의 과정에서 CPU가 수행해야 할 일을 늘리는 결과로 이어진다.
템플릿 매개변수는 디폴트 값 지정도 가능하다.
-> 함수의 매개변수에 디폴트 값의 지정이 가능하듯이, 템플릿 매개변수에도 디폴트 값의 지정이 가능하다.
T에 int가, len에 7이 디폴트 값으로 지정되었다.
※ 위 예제에서 보이듯이 템플릿 매개변수에 디폴트 값이 지정되어도, 템플릿 클래스의 객체생성을 의마하는 <> 기호는 반드시 추가되어야 한다. 비록 그안을 비워둘지라도!!
'Programming > C++' 카테고리의 다른 글
예외처리(Exception Handling) (0) | 2012.10.17 |
---|---|
템플릿과 static (0) | 2012.10.17 |
클래스 템플릿의 부분 특수화(Class Template Partial Specialization) (0) | 2012.10.16 |
클래스 템플릿의 특수화 (Class Template Specialization) (0) | 2012.10.16 |
템플릿 클래스의 객체를 인자로 받는 일반함수의 정의와 friend 선언 (0) | 2012.10.15 |