때때로 매개변수형이라고 일컬어지는 템플릿은 형 매개변수에 기반을 두고 있는 함수와 클래스를 생성할 때의 메커니즘이다. 템플릿을 사용함으로써, 각각의 타입마다 분리된 클래스를 만들어야하는 대신 여러 자료형 연산을 하는 단일 클래스나 함수로 디자인 할 수 있다.

Remark

예) 템플릿을 사용하지 않고 두 매개변수 중 작은 값을 리턴하는 typesafe 함수를 생성하기 위해서는 다음과 같이 오버로드된 집합을 작성해야 할 것이다.
 // what_are_templates1.cpp
 // compile with: /c
 // min for ints
 int min( int a, int b ) {
    return ( a < b ) ? a : b;
 }
 // min for longs
 long min( long a, long b ) {
    return ( a < b ) ? a : b;
 }
 // min for chars
 char min( char a, char b ) {
    return ( a < b ) ? a : b;

템플릿을 사용하면, 하나의 함수 템플릿으로 위와 같은 중복을 감소시킬수 있다.
 // what_are_templates2.cpp
 // compile with: /c
 template <class T> T min( T a, T b ) {
    return ( a < b ) ? a : b;
 }

템플릿은 소스 코드의 크기를 충분히 의미있게 줄여주고 type safety를 감소시키지 않으면서 코드의 유연성을 증가시킨다.

다음은 템플릿의 두 가지 주요 타입이다(함수 템플릿과 클래스 템플릿). 앞의 예에서 min은 함수 템플릿이다. A 클래스 템플릿은 매개변수를 가진 클래스이다. 다음을 보자:

 // what_are_templates3.cpp
 template <class T> class A {
    T m_t;
    public:
       A(T t): m_t(t) {}
       void f(T t);
 };

 int main() {
    A<int> a(10);
 }


템플릿은 몇가지 큰 차이점을 제외하고는 다른 함수나 클래스처럼 선언되고 정의된다. 템플릿 선언은 함수나 클래스를 완전히 정의하지 않는다(클래스나 함수의 문법적 골격만을 정의). 실질적인 클래스나 함수는 instantiation(인스턴스화)라 불리는 프로세스에 의해 템플릿으로부터 만들어진다. 각각의 클래스나 함수 생성은 instantiation으로 참조된다.

클래스 템플릿 예:
 template <class T> struct A { . . . };

위와 같은 클래스 템플릿은 A<int>, A<char>, A<int*>, A<MyClass*> 등등 instantiate class로 사용될 수 있다.

클래스나 함수의 instantiation은  explicit나 implicit으로 사용될 수 있다. Explicit instantiation은 코드에서 템플릿이 생성될 버전을 불러오는 한 방법이다. Implicit instantiation은 포인터가 처음으로 사용되는 곳에서 필요에 따라 템플릿이 인스턴스화 되도록 허용한다.

템플릿은 템플릿 매개변수가 함수에 매개변수처럼 선언되는 경우 값 매개변수(value parameter)에 의해 매개변수화될 수도 있다.

 // what_are_templates4.cpp
 // compile with: /EHsc
 #include <iostream>
 using namespace std;

 template <int i> class A {
    int array[i];
 public:
    A() { memset(array, 0, i*sizeof(int)); }
 };

 int main() {
    A<10> a;
 }


일반적인 템플릿 사용의 문제는 템플릿이 모든 솔루션에 하나의 크기로 맞춰져있다는 것이다. 이는 같은 코드는 모든 타입에 동일하게 적용된다는 뜻이다. 특정 자료형을 위한 템플릿의 동작을 변경할 필요가 있다면, 다양한 자료형의 매개변수를 가지면서 모든 매개변수가 아니라 특정 몇몇의 매개변수에 대한 동작만 변경하고 싶은 템플릿을 보유하고 있을 때 유용한 템플릿 특수화(template specialization)을 사용할 수 있다. 부분 특수화(a partial specialization)는 여전히 일반적이며, 실제 인스턴스 템플릿을 생산하기 위해 실재하는 템플릿 인수(real template arguments)가 필요하다.

'Programming Languages > C++ Templates' 카테고리의 다른 글

Advantages of Templates [C++]  (0) 2010.08.31
Template Specifications  (0) 2010.05.10
Templates  (0) 2010.05.09
Posted by 독뽀
,