본문 바로가기

Information Technology/C++

[C++] 자료형이 아닌 템플릿 매개변수

이 글은 개인의 학습을 목적으로 정리한 글입니다. 이점 참고하고 읽어주세요 ;)

 


이번에는 템플릿의 매개변수 중 자료형이 아닌 매개변수를 다뤄보겠습니다.

 

template<typename T>
class MyArray
{
private:
	int m_length;
	T* m_data;
.
.

위의 코드 블록은 앞선 포스팅에서 클래스 템플릿을 다룰 때 사용한 클래스입니다.

여기서 템플릿의 매개변수는 typename T 단 하나입니다.

배열의 길이를 m_length로 받고, 사용할 자료형의 포인터에 멤버를 저장하는 방식을 사용했습니다.

 

int main()
{
	MyArray<int> my_array(100);
.
.

main 함수에서 이런 식으로 템플릿 매개변수 T의 자리에 사용할 자료형을 입력하고,

생성자를 통해 배열의 길이를 정했습니다.

 

template<typename T, unsigned int T_SIZE>
class MyArray
{
private:
	T* m_data;
.
.

이번에는 MyArray 클래스를 정의하는데, 매개변수에 typename T 외에 unsigned int T_SIZE라는 매개변수를 하나 더 설정했습니다. 함수에서 매개변수를 정하듯이 자료형변수 이름을 입력하면 됩니다.

저 unsigned int T_SIZE를 통해 배열의 길이를 전달해주기 때문에, MyArray 클래스의 멤버에서 배열의 길이를 저장하는 m_length는 삭제했습니다.

 

int main()
{
	MyArray<int, 100> my_array;
.
.

변경한 MyArray 클래스를 사용하는 방법은 위와 같습니다. 템플릿 매개변수 T가 들어가야 할 자리에는 사용할 자료형을 입력하고, 그 옆에 unsigned int T_SIZE에는 설정한 자료형에 알맞은 값을 입력하면 됩니다.

주의하실 점은, 템플릿의 매개변수에는 일반 변수를 입력하지 못한다는 점입니다.

 

int i = 100;
MyArray<int, i> my_array; // error!

위의 코드와 같이 unsigned int T_SIZE의 자리에 int형 변수 i를 입력하게 되면 에러가 발생하게 됩니다.

그 이유는 템플릿은 컴파일 타임에 값이 정해진 것들만 사용할 수 있기 때문이라고 해요.

변수는 말 그대로 값이 변할 수 있어 런타임에서 최종 값이 정해지기 때문에

const int i = 100;

위와 같이 int i의 값이 변하지 않도록 const 선언을 하면 그땐 템플릿에 사용할 수 있지만, 100을 입력하는 것과 별 차이가 없기 때문에 잘 사용하지 않는다고 합니다.

'Information Technology > C++' 카테고리의 다른 글

[C++] 클래스 템플릿 특수화  (0) 2019.11.20
[C++] 함수 템플릿 특수화  (0) 2019.11.20
[C++] 클래스 템플릿  (0) 2019.11.19
[C++] 함수 템플릿  (0) 2019.11.19
[C++] 변환 생성자와 explicit  (0) 2019.11.19