템플릿

Oak_Cassia·2021년 11월 28일
0

템플릿

  • 템플릿을 사용하면 어떤 기능을 하는 함수를 다양한 시그니처(반환형, 매개변수)로 만들 수 있다.
  • 클래스를 대상으로도 적용할 수 있다.
  • 템플릿을 통해 특정 타입에 대한 함수를 정의할 수 있다.
  • 기본값을 설정할 수 있다.
#include <iostream>
using namespace std;


int StrLenngth(char* a)
{
	int cnt = 0;
	while (*(a+cnt) != NULL)
	{
		cnt++;
	}
	return cnt;
}

template<typename T> // typename 대신 class라고 써도 된다.
T Add(T a, T b)
{
	return a + b;
}

template<>//char*에 대한 템플릿 특수화
char* Add( char* a, char* b)
{
	int al = StrLenngth(a);
	int bl = StrLenngth(b);
	char* c= new char[20];
	for (int i = 0; i < al; i++)
	{
		*(c + i) = *(a + i);
	}
	for (int i = al; i-al<bl; i++)
	{
		c[i] = b[i - al];
	}
	c[al + bl] = NULL;
	return c;
}

class Money
{
public:
	int money;
	Money(int a) :money(a) {}
	const Money& operator+(const Money& m)
	{
		return Money (money + m.money);
	}
};

template<typename T, int MAX>
class NumSet
{
public:
	NumSet(T a) 
	{
		for (int i = 0; i < MAX; i++)_data[i]=a;
	}
	

public:
	T  _data[MAX];
	
};
template<typename T, int MAX>
 ostream& operator<<(ostream& c, NumSet<T, MAX>& n)
{
	for (int i = 0; i < MAX; i++) {
		c << n._data[i] << endl;
	}
	return c;
}

int main()// 템플릿으로 만드는 함수는 컴파일 단계에서 생성된다.
{
	int i1 = 9;
	int i2 = 8;
	int i3 = Add(i1, i2);

	float f1 = 4.4f;
	float f2 = 5.5f;
	float f3 = Add<float>(f1, f2); // <> 안에 넣어줄 수 도 있고 인자가 명확하면 생략해도 된다.

	 char a[] = "hello";
	 char b[] = "world";
	 char *c = Add(a, b);
	cout << c << endl;

	Money m1(100);
	Money m2(200);
	Money m3 = Add(m1, m2);//객체를 템플릿 함수로 사용할면 상황에 따라 연산자 오버로딩 필요!
	cout << m3.money << endl;


	NumSet<int,10> in1(5);
	NumSet<double,13> dn1(4.4);
	cout << in1<<endl;
	cout << dn1<<endl;

}
profile
rust로 뭐할까

0개의 댓글