[[TableOfContents]] == 내용 == === 함수 템플릿 === * 변수 타입으로 실제 타입 이름이 아니라 매개변수를 사용 * 실행시 보다 정확한 정의가 결정됨 * 오버로딩이 간단해짐 * 필요할 때마다 정의를 생성한다 * 예시 : {{{ template T max(const T& a, const T& b) { return (a > b) ? a : b; } }}} * template : 템플릿 전위문 * 뒤따라 나오는 것이 템플릿이라는 것을 컴파일러에 알려줌 * T는 형 매개변수라는 것을 컴파일러에 알려줌 * 예시 2 : {{{ cout << max(3, 5); // T is int cout << max(4.3, 5.6); // T is double cout << max(4, 5.5); // Error cout << max(4, 5.5); // OK - 명시적 형변환 }}} * More than one argument : {{{ template void print_max(const T1& a, const T2& b) { ... } }}} * 사용되지 않는 템플릿 매개 변수가 있으면 안 된다 * 하나의 타입 매개변수만 쓰는 것이 보다 일반적이다 * 컴파일러 복잡성 * 함수 선언과 정의 * 분리하여 많이 사용한다 * 템플릿의 경우 : 대부분의 컴파일러에서 지원하지 않음 * 템플릿 함수 정의를 호출이 되는 파일에 위치시키는 것이 안전하다 * 많은 컴파일러에서 정의가 호출보다 위쪽에 위치해야 한다 * 모든 템플릿 정의를 #include으로 첨부하는 방법을 많이 쓴다 * 알고리즘 추상화 * 템플릿을 구현하는 것 * 템플릿 구현 전략 * 함수를 평범하게 개발한다 : 실제 데이터 사용 * 일반 함수로서 완전히 디버깅을 끝낸다 * 템플릿으로 바꾼다 * Why? * 컴파일러는 구체화된 템플릿 함수에 대해서만 에러 체크를 할 뿐, 템플릿 자체에 대해서는 상세한 점검 불가 * 컴파일러는 템플릿의 모양만 기억해 둘 뿐 구문상의 에러 체크를 하지 않음 * 오타가 있거나 if = for + while; 같은 말도 안되는 구문까지도 일단은 컴파일됨 * 템플릿에 부적절한 타입 * 템플릿에 적합한 타입이 사용되어야 한다 * 할당 연산자가 정의되지 않은 타입은 쓸 수 없다 * 예 : 배열 {{{ template void swapValues(T& var1, T& var2) { T temp; temp = var1; var1 = var2; var2 = temp; } // 배열은 할당될 수 없음 int a[10], b[10]; swapValues(a, b); }}} === 클래스 템플릿 === * 클래스를 일반화할 수 있다 * 템플릿 함수와 동일하게 작동 * 예시 : {{{ template class Pair { public: Pair(); Pair(T firstVal, T secondVal); ... private: T first; T second; }; }}} * 예시 2 : {{{ template Pair::Pair(T firstVal, T secondVal) { first = firstVal; second = secondVal; } template void Pair::setFirst(T newVal) { first = newVal; } }}} * 매개 변수로서의 클래스 템플릿 * {{{int addUP(const Pair& thePair);}}} * 클래스 타입 매개 변수 T를 대체하기 위해 int가 사용됨 * Pair는 보통 일반 클래스 타입과 동일하게 사용 가능 * 템플릿 타입은 보통 타입이 사용되는 것과 똑같이 사용될 수 있다 * 타입 매개 변수에 제한 * 할당 연산자가 잘 정의되어야 한다 * 복사 생성자가 작동해야 한다 * T의 포인터가 제공된다면 소멸자가 적절히 작동해야 한다 * 타입 정의 * {{{typedef Pair PairOfInt;}}} * Friend와 Template * 프렌드 함수가 템플릿과 함께 사용될 수 있다 === 템플릿과 상속 === * 파생 템플릿 클래스 * 템플릿 클래스 또는 일반 클래스로부터 상속될 수 있다 * 템플릿 클래스의 자식 클래스는 자연히 템플릿 클래스가 되어야 한다 ----- [Oops]