-
2024.02.29 - templateC++ 2024. 3. 4. 17:58
아래와 같은 함수가 있다.
int GetMax(int x, int y) { if (x > y) return x; else return y; }
정수 둘을 받아 높은 값을 반환하는 함수다. 실수 둘을 비교하는 함수도 만들고 싶다.
float GetMax(float x, float y) { if (x > y) return x; else return y; }
음 좋다. short형 둘을 비교하는 함수도 만들고 싶다.
float GetMax(short x, short y) { if (x > y) return x; else return y; }
내친김에 double형도...
이런식으로 만들다가는 끝이없다.
template를 사용하면 함수의 기능은 유지하되, 자료형은 모호하게 만들 수 있다.
#include<iostream> template <typename T> T GetMax(T x, T y) { if (x > y) return x; else return y; } int main() { std::cout << GetMax(1, 2) << std::endl; std::cout << GetMax(1.5, 2.3) << std::endl; }
정수형은 정수형으로, 실수형은 실수형으로 받아 동작한다.
단, 형식 매개변수(typename)가 하나밖에 없기 때문에, 두 종류의 자료형을 매개변수로 받는 것은 불가능하다.
#include<iostream> template <typename T> T GetMax(T x, T y) { if (x > y) return x; else return y; } int main() { std::cout << GetMax(1.5, 2) << std::endl; }
여러개의 자료형을 매개변수로 받고 싶다면, 형식 매개변수를 늘려주면 된다.
#include<iostream> template <typename T1, typename T2> void PrintGetMax(T1 x, T2 y) { if (x > y) std::cout << x << std::endl; else std::cout << y << std::endl; } int main() { PrintGetMax(1.5, 3); }
class도 template로 만들 수 있다. 인스턴스를 만들때 <>안에 자료형을 넣어주어야 한다.
#include<iostream> template <typename T> class Box { private: T data; public: void SetData(T d) { data = d; } T GetData() { return data; } void Print(); }; int main() { Box<std::string> box1; box1.SetData("박스"); box1.Print(); } template <typename T> void Box<T>::Print() { std::cout << "data = " << data << std::endl; }
두 종류의 매개변수를 가지는 클래스 template도 만들 수 있다.
#include<iostream> template <typename T1, typename T2> class Box2 { private: T1 firstData; T2 secondData; public: T1 GetFirst() { return firstData; } T2 GetSecond() { return secondData; } void SetFirst(T1 val) { firstData = val; } void SetSecond(T2 val) { secondData = val; } }; int main() { Box2<int, float> bx; bx.SetFirst(1); bx.SetSecond(2.1); std::cout << bx.GetFirst() << ", " << bx.GetSecond() << std::endl; }
'C++' 카테고리의 다른 글
배열을 매개변수로 받는 함수 안에서 배열의 크기 구하기 (0) 2024.03.03 2024.02.29 - iterator (0) 2024.03.03 2024.02.29 - vector (0) 2024.03.03 2024.02.28 - class 아주 기본적인 내용 (0) 2024.03.03 2024.02.28 - 키워드, 식별자, namespace, 범위 지정 연산자(::), std, using (0) 2024.03.02