SeoulTech 2011-2 nd 프로그래밍입문 (2) Chapter 16. 템플릿 박종혁교수 (http://www.parkjonghyuk.net) Tel: 970-6702 Email: jhpark1@snut.ac.kr
Learning Objectives 함수템플릿 구문, 정의 컴파일합병 클래스템플릿 문법 예 : 배열템플릿클래스 템플릿및상속 예 : 부분적으로채워진배열템플릿클래스 16-2
개요 C++ templates 함수와클래스에대한매우 " 일반 " 정의허용 입력한이름대싞실제유형의 " 매개변수 정확한정의는실행시간에결정 16-3
함수템플릿 swapvalues: void swapvalues(int& var1, int& var2) { int temp; temp = var1; var1 = var2; var2 = temp; } 오직 int 형변수에적용 어느종류의자료형에서도동장! 16-4
함수템플릿 vs. 오버로딩 문자형에함수오버로드가능 : void swapvalues(char& var1, char& var2) { char temp; temp = var1; var1 = var2; var2 = temp; } 주의 : 코드는거의동일! 차이점은 3 장소에서사용되는유형 16-5
함수템플릿문법 swap values 함수는어느자료형이든가능 : template<class T> void swapvalues(t& var1, T& var2) { T temp; temp = var1; var1 = var2; var2 = temp; } 첫번째줄은 "template prefix 컴파일러에게 "template 이라고알려줌 T 는형식매개변수 16-6
Template Prefix Recall: template<class T> "class" 는 "type 이나 "classification 을의미 앞에서사용한 class 와혼동 C++ 은 "class" 자리에키워드 "typename" 을허용 하지만 "class" 라고주로사용 16-7
Template Prefix 2 Again: template<class T> T 는모든종류로교체가능 미리정의되거나사용자정의 (like a C++ class type) 함수정의부 : T 는다른형식처럼사용 참고 : "T 외에다른것이사용되기도하지만 T 는 "traditional" 사용 16-8
함수템플릿정의 swapvalues() 함수템플릿은매우큰정의의 "collection! 각각의가능한유형에대한정의! 컴파일러는필요에따라정의를생성 그러나모든유형에대해정의하는경우 한개의정의 필요한모든유형으로작동 16-9
함수템플릿호출 swapvalues(int1, int2); C++ 컴파일러는템플릿으로두개의정수형인자를사용하는함수를생성 다른타입도마찬가지 필요한정의자동생성 16-10
Another Function Template Declaration/prototype: Template<class T> void showstuff(int stuff1, T stuff2, T stuff3); Definition: template<class T> void showstuff(int stuff1, T stuff2, T stuff3) { cout << stuff1 << endl << stuff2 << endl << stuff3 << endl; } 16-11
showstuff Call showstuff(2, 3.3, 4.4); 컴파일러는함수의정의를생성 T 를더블로교체 두번째인자가더블형이기때문 Displays: 2 3.3 4.4 16-12
Compiler Complications 함수선언및정의 일반적으로구분이필요 템플릿 모든컴파일러에서지원되지않음! 템플릿함수정의는호출하는파일안에안전한장소에위치 16-13
More Compiler Complications 컴파일러의특정요구사항을확인 일부는특정옵션필요 일부는템플릿정의 vs 다른파일 item 들의배열을요구 대부분사용가능한템플릿프로그램레이아웃 : 동일한파일에서사용되는템플릿정의 사용되기전확인한템플릿정의 16-14
Multiple Type Parameters 가능 : template<class T1, class T2> 일반적이지않음 보통하나의교체타입이필요 사용하지않는템플릿매개변수를가질수없음 각정의에서사용해야함 Error otherwise! 16-15
알고리즘추상화 템플릿구현을의미 알고리즘을표현하는일반적이방법 : 알고리즘은모든타입의변수에적용 세부사항을무시 알고리즘의중요한부분에집중 함수템플릿은알고리즘추상화를지원하는방법 16-16
Defining Templates Strategies 일반적함수개발 실제데이터타입사용 일반적인함수완벽하게디버그 템플릿으로변환 필요한경우매개변수와타입이름교체 이점 : 구체적인케이스해결이더쉬움 16-17
템플릿에서부적절한타입 템플릿에서코드는의미를만들어어떠한타입에서도사용할수있음 코드가적절한방식으로행동해야함 예, swapvalues() template function 할당연산자가정의되지않은형식을사용할수없음 Example: an array: int a[10], b[10]; swapvalues(a, b); Arrays cannot be "assigned"! 16-18
Class Templates template<class T> 클래스정의에적용가능 클래스정의에서 "T" 의모든인스턴스는형식매개변수로대체 그냥함수템플릿처럼! 템플릿정의되면, 클래스의객체를선언 16-19
Class Template Definition template<class T> class Pair { public: Pair(); Pair(T firstval, T secondval); void setfirst(t newval); void setsecond(t newval); T getfirst() const; T getsecond() const; private: T first; T second; }; 16-20
Template Class Pair Members template<class T> Pair<T>::Pair(T firstval, T secondval) { first = firstval; second = secondval; } template<class T> void Pair<T>::setFirst(T newval) { first = newval; } 16-21
Template Class Pair 클래스의객체는 T 타입값의쌍을갖음 다음개체를선언가능 : Pair<int> score; Pair<char> seats; Example uses: score.setfirst(3); score.setsecond(0); 16-22
Pair Member Function Definitions 멤버함수정의 : 각각의정의는템플릿자체 정의전에템플릿 prefix 필요 Class name before :: is "Pair<T>" Not just "Pair" 생성자이름 "Pair" 소멸자이름 "~Pair" 16-23
Class Templates as Parameters int addup(const Pair<int>& the Pair); call-by-reference 표준타입에템플릿타입을사용가능 16-24
Restrictions on Type Parameter T에서합당한타입은대체가능 고려 : 할당연산자는 "well-behaved" 복사연산자작동 T 가포인터를포함하면, 소멸자가적합해야함 함수템플릿과유사한문제 16-25
Type Definitions 새로운클래스타입이름을정의가능 특별한클래스템플릿이름ㅍ현 Example: typedef Pair<int> PairOfInt; PairOfInt pair1, pair2; 이름도매개변수로사용하거나다른곳에타입이름으로사용가능 16-26
Friends and Templates Friend 함수는템플릿클래스와함께사용가능 일반클래스와동일 단순히적절한형식매개변수를요구 템플릿클래스의 friend 사용은일반적 특히연선자오버로드 16-27
Predefined Template Classes vector class 템플릿클래스 Another: basic_string template class 어떤타입요소의문자열을다룸 예, basic_string<char> works for char s basic_string<double> works for doubles basic_string<yourclass> works for YourClass objects 16-28
basic_string Template Class "string basic_string<char> 모든멤버함수는 basic_string<t> 와유사하게동작 16-29
템플릿및상속 파생템플릿클래스 템플릿이나비템플릿클래스에서파생가능 파생클래스는하나의템플릿클래스 문법은일반클래스에서파생된일반클래스와동일 16-30
요약 함수템플릿 타입에대한매개변수와함께함수를정의 클래스템플릿 클래스의부분에대한매개변수와함께클래스를정의 Predefined vector, basic_string 는템플릿클래스 템플릿베이스클래스에서파생된템플릿클래스정의가능 16-31