728x90

동작하는 방식은 똑같은데 parameter 가 다른경우 일일이 다른 함수를 만들어 줘야하는 번거로움이 있습니다.

 

int getMax(int x, int y) {
	return (x > y) ? x : y;
}

double getMax(double x, double y) {
	return (x > y) ? x : y;
}

두가지 만 해도 함수를 하나더 만들어 줘야하는데 float char 등등.. 여러가지 type의 같은 함수를 많이 만들수록 유지보수도 힘들어집니다.

 

그래서 template 라는 함수를 사용해서 코드를 간소화 시키겠습니다.

 

template<typename T>
T getMax(T x, T y) {
	return (x > y) ? x : y;
}

template<typename T> 보통 T를 많이 쓰지만 원하시는 변수명을 지으셔도 상관없습니다.

이렇게 되면 

 

#include <iostream>

template<typename T>
T getMax(T x, T y) {
	return (x > y) ? x : y;
}

int main()
{
	std::cout << getMax(1, 2) << std::endl;
	std::cout << getMax(3.14, 1.592) << std::endl;
	return 0;
}

컴파일러가 자동으로 type잡아서 함수를 오버로딩 한것처럼 작동합니다.

 

 

 

template를 사용하실 때 주의할점을 살펴보겠습니다.

 

#pragma once

#include <iostream>

class Cents
{
private:
	int m_cents;

public:
	Cents(int cents)
		: m_cents(cents)
	{}
};

Cents라는 클래스를 헤더파일로 만들고 초기화를 합니다.

template함수로 만들어진 getmax를 이용해 두 동전의 크기를 비교해보겠습니다.

 

#include <iostream>
#include "Cents.h"

template<typename T>
T getMax(T x, T y) {
	return (x > y) ? x : y;
}

int getMax(int x, int y) {
	return (x > y) ? x : y;
}

double getMax(double x, double y) {
	return (x > y) ? x : y;
}


int main()
{
	std::cout << getMax(1, 2) << std::endl;
	std::cout << getMax(3.14, 1.592) << std::endl;

	std::cout << getMax(Cents(5), Cents(9)) << std::endl;
	return 0;
}

이렇게 Cents를 바로 비교한다면 컴파일러 에러가 나실껍니다.

template를 사용하기위해서는 미리 준비를 해주지 않는이상 사용할수 없습니다.

 

비교 연산자와 출력 연산자를 오버로딩하겠습니다.

 

#pragma once

#include <iostream>

class Cents
{
private:
	int m_cents;

public:
	Cents(int cents)
		: m_cents(cents)
	{}

	friend bool operator > (const Cents& c1, const Cents& c2) {
		return (c1.m_cents > c2.m_cents);
	}

	friend std::ostream& operator << (std::ostream& out, const Cents& cents) {
		out << cents.m_cents << " cnets ";
		return out;
	}
};

2
3.14
9 cnets
계속하려면 아무 키나 누르십시오 . . .

 

결과가 잘 출력된 모습입니다.

728x90