티스토리 뷰

반복되는 함수의 형태가 계속된다면 템플릿을 사용하게 되면 해결 할 수 있다.

 

#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;
	std::cout << getMax(1.0f, 3.4f) << std::endl;
	std::cout << getMax('a', 'c') << std::endl;
	return 0;
}

// 2
// 3.14
// 3.4
// c

 

클래스 또한 비교가 가능하다.

 

 

하지만, 템플릿이 사용하는 함수의 기능이 클래스 내에 구현이 되어있어야한다는 조건이있다.

 

예를들어 위의 코드의 경우 ">"가 있다.

 

클래스 내에서는 위의 기능을 구현한 operator가 필요하다.

 

 

13.2

 

 

클래스의 외부함수가 딴 cpp 파일에 있을시 그 함수는 그 클래스가 어떤 자료형으로 작동하는지 알수가 없다.

 

그래서 이러한 문제를 해결하기 위해서는

 

explicit instantiation이 필요하다.

 

해당 cpp 파일에

// 방법 1
template void MyArray<char>::print();
template void MyArray<double>::print();

// 방법 2
template class MyArray<char>;
template class MyArray<double>;

 

 

#include<iostream>
#include<assert.h>

template<typename T>
class MyArray
{
	private:
	int m_length;
	T *m_data;
	
	public:
	MyArray()
	{
		m_length = 0;
		m_data = nullptr;
	}
	
	MyArray(int length)
	{
		m_data = new T [length];
		m_length = length;
	}
	
	~MyArray()
	{
		reset();
	}
	
	void reset()
	{
		delete[] m_data;
		m_data = nullptr;
		m_length = 0;
	}
	
	T & operator [](int index)
	{
		assert(index >= 0 && index < m_length);
		return m_data[index];
	}
	
	int getLength()
	{
		return m_length;
	}
	
	void print();
};

template<typename T>
void MyArray<T>::print()
	{
		for(int i = 0; i < m_length; i++)
			std::cout << m_data[i] << " ";
	}

template class MyArray<char>;
template class MyArray<double>;

int main()
{
	MyArray<double> my_array(10);
	
	for(int i = 0; i < my_array.getLength(); ++i)
		my_array[i] = i + 0.5;
	
	my_array.print();
}
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함