본문 바로가기

문과 코린이의, [C. C++] 기록/C++ 이론

[문과 코린이의 IT 기록장] C++ - 템플릿 인자 (템플릿 매개변수의 변수 선언, 템플릿 매개변수에 디폴트 값 지정)

반응형

[문과 코린이의 IT 기록장] C++ - 템플릿 인자 (템플릿 매개변수의 변수 선언, 템플릿 매개변수에 디폴트 값 지정)

[문과 코린이의 IT 기록장] C++ - 템플릿 인자 (템플릿 매개변수의 변수 선언, 템플릿 매개변수에 디폴트 값 지정)

 


[ 클래스 템플릿에 대한 이전 포스팅 ]

2021.06.29 - [문과 코린이의, [C. C++] 기록/C++ 이론] - [문과 코린이의 IT 기록장] C,C++ - 템플릿(Template)에 대한 이해와 함수 템플릿 (함수를 대상으로 템플릿 이해하기, 함수 템플릿과 템플릿 함수, 둘 이상의 형(Type)에 대해 템플릿 선언하기, 함수 ..

 

[문과 코린이의 IT 기록장] C,C++ - 템플릿(Template)에 대한 이해와 함수 템플릿 (함수를 대상으로 템

[문과 코린이의 IT 기록장] C,C++ - 템플릿(Template)에 대한 이해와 함수 템플릿 (함수를 대상으로 템플릿 이해하기, 함수 템플릿과 템플릿 함수, 둘 이상의 형(Type)에 대해 템플릿 

vansoft1215.tistory.com

2021.06.29 - [문과 코린이의, [C. C++] 기록/C++ 이론] - [문과 코린이의 IT 기록장] C++ - 클래스 템플릿(Class Template) (클래스 템플릿의 정의, 클래스 템플릿의 선언과 정의의 분리, 배열 클래스의 템플릿화)

 

[문과 코린이의 IT 기록장] C++ - 클래스 템플릿(Class Template) (클래스 템플릿의 정의, 클래스 템플릿

[문과 코린이의 IT 기록장] C++ - 클래스 템플릿(Class Template) (클래스 템플릿의 정의, 클래스 템플릿의 선언과 정의의 분리, 배열 클래스의 템플릿화) 1. 클래스 템플릿의 정의 [문과

vansoft1215.tistory.com

2021.06.30 - [문과 코린이의, [C. C++] 기록/C++ 이론] - [문과 코린이의 IT 기록장] C++ - 클래스 템플릿(Class Template) (Point 클래스 템플릿과 배열 클래스 템플릿, 특정 템플릿 클래스의 객체를 인자로 받는 일반함수의 정의와, friend 선언)

 

[문과 코린이의 IT 기록장] C++ - 클래스 템플릿(Class Template) (Point 클래스 템플릿과 배열 클래스 템

[문과 코린이의 IT 기록장] C++ - 클래스 템플릿(Class Template) (Point 클래스 템플릿과 배열 클래스 템플릿, 특정 템플릿 클래스의 객체를 인자로 받는 일반함수의 정의와, friend 선..

vansoft1215.tistory.com

2021.06.30 - [문과 코린이의, [C. C++] 기록/C++ 이론] - [문과 코린이의 IT 기록장] C++ - 클래스 템플릿의 특수화(Class Template Specialization) (클래스 템플릿 특수화, 클래스 템플릿의 부분 특수화)

 

[문과 코린이의 IT 기록장] C++ - 클래스 템플릿의 특수화(Class Template Specialization) (클래스 템플릿

[문과 코린이의 IT 기록장] C++ - 클래스 템플릿의 특수화(Class Template Specialization) (클래스 템플릿 특수화, 클래스 템플릿의 부분 특수화) [ 클래스 템플릿에 대한 이전 포스팅 ] 2021.0..

vansoft1215.tistory.com

 


1. 템플릿 매개변수에는 변수의 선언이 올 수 있다.

# 템플릿 매개변수 : T1, T2와 같은 문자들

 

ex )

template <typename T, int len>
class SimpleArray{
private:
	T arr[len];
public:
	T& operator[] (int idx){
    	return arr[idx];
    }
}

이 정의를 보면, 템플릿 매개변수의 선언에 마치 함수처럼 변수의 선언이 나타난다.

이와같이 템플릿 매개변수에도 변수가 올 수 있으며, 다음과 같은 형태로 객체생성 또한 가능하다.

SimpleArray<int,5> i5arr;
SimpleArray<double,7) d7arr;

위 문장에서 템플릿 매개변수 len에 전달된 인자 5,7은 해당 템플릿 클래스에서 상수처럼 사용된다.

// <int,5>
class SimpleArray<int, 5>
{
private:
	int arr[5];
public:
	int& operator[] (int idx) {return arr[idx];)
};

// <double,7>
class SimpleArray<double, 7>
{
private:
	double arr[7];
public:
	double& operator[] (int idx) {return arr[idx];)
};

Case 1 ) 

템플릿 매개변수에 정수를 전달하는 작업은, 마치 생성자를 이용해서 배열의 길이를 결정하는 것과 비슷하다.

따라서 생성자를 이용해는게 더 편리할 수도 있는데, 그렇다면 왜 템플릿 매개변수에 정수를 전달하는 작업은 문법적으로 왜 필요한 것일까?

#include<iostream>
using namespace std;

template <typename T, int len>
class SimpleArray {
private:
	T arr[len];
public:
	T& operator[](int idx) { return arr[idx]; }
	SimpleArray<T, len>& operator=(const SimpleArray<T, len>& ref)
	// 대입연산자
	// 매개변수로 들어오는 SimpleArray<T,len>형의 객체 &ref는 값이 변화하면 안되므로 const 붙여주기
	// 반환형 : 참조형 (SimpleArray<T,len>&)
	{
		for (int i = 0; i < len; i++) {
			arr[i] = ref.arr[i];
		}
		return *this;
	}
};

int main() {
	SimpleArray<int, 5> i5arr1;
	for (int i = 0; i < 5; i++) {
		i5arr1[i] = i * 10;
	}

	SimpleArray<int, 5> i5arr2;
	i5arr2 = i5arr1;
	for (int i = 0; i < 5; i++) {
		cout << i5arr2[i] << ", ";
	}
	cout << endl;

	SimpleArray<int, 7> i7arr1;
	for (int i = 0; i < 7; i++) {
		i7arr1[i] = i * 10;
	}

	SimpleArray<int, 7> i7arr2;
	i7arr2 = i7arr1;
	for (int i = 0; i < 7; i++) {
		cout << i7arr2[i] << ", ";
	}
	cout << endl;
	return 0;
}

 

위 예제에서 주목할 사실은 SimpleArray<int,5>와 SimpleArray<int,7>서로 다른 형(type)이라는 것이다.

따라서 길이가 다른 두 배열 객체간의 대입은 허용되지 않기때문에, 다음과 같은 코드에서는 컴파일 에러가 발생한다.

int main()
{
    SimpleArray<int,5> i5arr1;
    SimpleArray<int,7> i7arr1;
    i5arr1 = i7arr1; // 컴파일 에러 발생
    ...
}

따라서 위 예제에서는 자료형 및 길이가 같은 배열 객체에 대해서만 대입 및 복사가 허용되니, 이러한 부분에 대한 오류는 고려하지 않아도 된다.

 

그러나 생성자를 이용해서 배열의 길이를 결정하게 된다면, 길이가 같은 배열에 대해서만 대입을 가능하도록 하는 추가적인 코드를 꼭 삽입해야 할 것이다. 즉 이는 CPU가 수행해야 할 일을 늘리는 것이다.

 

 


2. 템플릿 매개변수는 디폴트 값 지정도 가능하다.

Case 2 )

 

#include<iostream>
using namespace std;

template <typename T=int, int len =7> // Default Value 지정
// 즉, T에 int가, len에 7 값이 디폴트 값으로 지정되었다.

class SimpleArray {
private:
	T arr[len];
public:
	T& operator[] (int idx) { return arr[idx]; }
	SimpleArray<T, len>& operator=(const SimpleArray<T, len>& ref) {
		for (int i = 0; i < len; i++) {
			arr[i] = ref.arr[i];
		}
		return *this;
	}
};

int main() {
	SimpleArray<> arr;
	// 디폴트 값을 이용한 객체의 생성
	// 디폴트 값이 지정될 경우에도, 탬플릿 클레스의 객체생성을 의미하는 <> 기호는 적어줘야 함

	for (int i = 0; i < 7; i++) {
		arr[i] = i + 1;
	}
	for (int i = 0; i < 7; i++) {
		cout << arr[i] << " ";
	}
	cout << endl;
	return 0;
}

 

 


* 유의사항
- 아직 공부하고 있는 문과생 코린이가, 정리해서 남겨놓은 정리 및 필기노트입니다.
- 정확하지 않거나, 틀린 점이 있을 수 있으니, 유의해서 봐주시면 감사하겠습니다.
- 혹시 잘못된 점을 발견하셨다면, 댓글로 친절하게 남겨주시면 감사하겠습니다 :)
반응형