[10.1]
/*
2개의 매개 변수 값을 교환하는 Swap 함수를 함수 템플릿으로 만들고 이를 테스트하기 위한
main 함수도 작성해 본다. 실매개 변수의 값도 교환되어야 한다.
함수 템플릿을 연습할 수 있는 기본적인 문제이다.
어려움이 있다면 int형을 위한 swap 함수를 먼저 작성한 후 템ㅍ프릿 매개 변수로 바뀌어야 될 부분을 생각해 본다
*/
#include <iostream>
using namespace std;
template <typename T>
void Swap(T &a, T &b)
{
T temp = a;
a = b;
b = temp;
}
int main(void)
{
int num1 = 10, num2 = 20;
cout << "num1: " << num1 << " num2: " << num2 << endl;
char num3 = 'a', num4 = 'b';
cout << "num3: " << num3 << " num4: " << num4 << endl;
double num5 = 1.1, num6 = 2.2;
cout << "num5: " << num5 << " num6: " << num6 << endl;
Swap(num1, num2);
Swap(num3, num4);
Swap(num5, num6);
cout << "Swap() 실행 후" << endl;
cout << "num1: " << num1 << " num2: " << num2 << endl;
cout << "num3: " << num3 << " num4: " << num4 << endl;
cout << "num5: " << num5 << " num6: " << num6 << endl;
return 0;
}
[10.2]
/*
배열과 원소의 개수를 매개변수로 전달받아 배열의 원소들 중 가장 큰 값을 반환하는 Max 함수
템플릿을 작성해 본다.
main 함수 및 실행 결과를 참고한다
*/
#include <iostream>
using namespace std;
template <typename T>
T Max(T *arr, int len)
{
T max = arr[0];
for (int i = 1; i < len; i++)
{
if (max < arr[i])
max = arr[i];
}
return max;
}
int main(void)
{
int ary1[4] = { 4, 5, 2, 7 };
double ary2[5] = { 1.1, 4.4, 8.8, 4.2, 5.5 };
cout << Max(ary1, 4) << endl;
cout << Max(ary2, 5) << endl;
return 0;
}
[10.3]
/*
다음 main 함수와 같이 수행될 수 있도록 CPoint 클래스 템플릿을 만들어 본다.
x, y 같은 동일한 타입을 갖는다
*/
#include <iostream>
using namespace std;
template <typename T>
class CPoint
{
T x;
T y;
public:
CPoint(T a = 0, T b = 0) :x(a), y(b)
{
}
CPoint operator+(CPoint &Po)
{
return CPoint(x + Po.x, y + Po.y);
}
template <typename T>
friend ostream &operator<<(ostream &out, CPoint<T> &Po);
};
template <typename T>
ostream &operator<<(ostream &out, CPoint<T> &Po)
{
out << "(" << Po.x << ", " << Po.y << ")";
return out;
}
int main(void)
{
CPoint<int> a(1, 2);
CPoint<int> b(3, 4);
CPoint<int> c = a + b;
cout << a << " + " << b << " = " << c << endl;
CPoint<double> d(1.2, 3.4);
CPoint<double> e(5.6, 7.8);
CPoint<double> f = d + e;
cout << d << " + " << e << " = " << f << endl;
return 0;
}
[10.4]
/*
2개의 서로 다른 타입의 데이터를 쌍으로 저장할 수 있는 CArray 클래스 템플릿을 만들어 보자.
예를 들면 CArray(<int, char> Obj; 객체는 int 값과 char 값을 쌍으로 저장할 수 있다.
문제를 쉽게 하기 위해 배열의 크기는 10으로 제한하며, 현재 저장되어 있는 개수까지만 유효한 데이터로 취급한다.
그리고 다음과 같은 처리가 가능해야 한다
Obj.put(1, 'a'); //현재까지 저장된 마지막 원소 다음에 데이터를 추가
cout<<Obj; //유효한 원소들을 쌍으로 출력한다
*/
#include <iostream>
using namespace std;
template <typename T1, typename T2>
class CArray
{
private:
T1 arr1[10]; //각각의 자료형에 대한 배열 선언
T2 arr2[10];
int len; //배열 길이
public:
CArray() :len(0)
{
}
void Put(T1 a, T2 b)
{
arr1[len] = a;
arr2[len] = b;
len++;
}
template <typename T1, typename T2>
friend ostream &operator<<(ostream &out, CArray<T1, T2> &Copy);
};
template <typename T1, typename T2>
ostream &operator<<(ostream &out, CArray<T1, T2> &Copy)
{
for (int i = 0; i < Copy.len; i++)
{
out << "(" << Copy.arr1[i] << ", " << Copy.arr2[i] << ")" << endl;
}
return out;
}
int main(void)
{
CArray<int, char> Obj;
Obj.Put(1, 'a');
cout << Obj;
return 0;
}
[10.5]
/*
다음 프로그램의 수행 결과는 무엇인가?
*/
#include <iostream>
using namespace std;
template <typename T>
T Sum(T a, T b)
{
T c = a + b;
return c;
}
template <>
int Sum(int a, int b)
{
int c = a*b;
return c;
}
int Sum(double a, double b)
{
int c = a - b;
return c;
}
int main(void)
{
int x = Sum(3, 4); //명시적형변환 template<> int Sum(int a, int b) 반환
double y = Sum(1.1, 2.2); //int Sum(double a, double b) 반환
//이유:호출 우선순위는 일반함수, 명시적 전문화에 의해 호출 가능한 함수, 함수 템플릿의 순서!
cout << x << endl;
cout << y << endl;
return 0;
}
개발 환경:Visual Studio 2017
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~
[참고] 기초를 탄탄히 세워주는 C++ 프로그래밍 입문 황준하 저
'C++ > 기초를 탄탄히 세워주는 C++ 프로그래밍 입문(황준하 저)' 카테고리의 다른 글
기초를 탄탄히 세워주는 C++ 프로그래밍 입문 12장 연습문제 (3) | 2017.07.12 |
---|---|
기초를 탄탄히 세워주는 C++ 프로그래밍 입문 11장 연습문제 (0) | 2017.07.10 |
기초를 탄탄히 세워주는 C++ 프로그래밍 입문 9장 연습문제 (0) | 2017.07.06 |
기초를 탄탄히 세워주는 C++ 프로그래밍 입문 8장 연습문제 (0) | 2017.07.04 |
기초를 탄탄히 세워주는 C++ 프로그래밍 입문 7장 연습문제 (0) | 2017.07.03 |