템플릿(임시)

2020. 11. 19. 16:49컴퓨터 수업/C++

참고:

m.blog.naver.com/vjhh0712v/221553593414

m.blog.naver.com/vjhh0712v/221561418596

blog.plorence.kr/528


할말:

C++에서는 템플릿, 자바에서는 generic이라고도 불리우는 이 "형식"은 arbitrary를 지원하기 위한 방식이다.

 

수학에서 흔히 보는 "임의의 x에 대해 condition1을 만족하는~" 이라는 문장은

 

다시말해, "모든 x에 대해" 라고 해석되기도 하므로.

 

이 "템플릿"이라는 형식은 "모든 형식에 대한 고려"와 "임의의 형식에 대한 고려"라는 의미를 함축한다.

 

"모든 형식에 대한 고려"의 관점에서 보면,

 

template<class T> 라는 statement는 컴파일타임에 모든것을 준비한다고도 여겨진다.

 

예를들어, 컴파일타임에 int, double, char 등등 모든 자료형에 대한 준비를 마쳐놓고, 런타임에 특정 호출이

 

발생하면 그 특정 함수를 호출하는 방법이다.

 

또한, "임의의 형식에 대한 고려"라는 관점에서 보면,

 

template<class T>라는 statement는 런타임에 특정 호출이 발생하면, 그제서야 부랴부랴 함수를 만들어내

 

는 작업이라고도 여겨진다.

 

잘은 모르지만, hpp라는 독립된 파일확장자를 보면, 앞의 "모든 형식에 대한 고려"라는 관점이 맞는것처럼 

 

보이지만, 동적 타입 바인딩이 추세인 현 상황에서는 SDK가 업그레이드 될 수록, 아래의 방식을 채용하지 

 

않을까 싶다.


템플릿 함수

목적 : 오버로딩 하는 귀찮음을 덜기 위해.

 

<기본>

형식1 : 선언과 정의를 동시에.

형식2: 선언과 정의를 따로.

<질문. 어떤 template함수를 불러올지 어떻게 결정?>

Max를 1과 2.5로 호출하였는데, 이때 컴파일에러가 나게된다.

따라서, 템플릿 함수는 아규먼트의 형식으로 템플릿형식이 지정(fix)된다.

 

<템플릿 함수를 아규먼트의 형식 즉, "묵시적"으로 호출하지 않고 "명시적"으로 호출하는 방법>

 

Max<int> 즉, 함수를 호출 할 때, template class처럼 <형식>을 지정해주니, 위의 묵시적 호출과 달리 오류도 나지 않는다.

 

<선언부와 실행부의 typename을 다르게>

실행 잘 되며, 어차피 선언부로는 제어권이 넘어가지도 않는다. 그저 병풍.

 

<여러 typename을 이용>

우선 이 케이스는 실행되는 케이스임.

 

주의깊게 봐야할 점은

 

1. 선언부와 정의부의 typename이 완전히 다름. 그럼에도 불구하고 실행이 되는데, 이는 위에서 설명한 병풍으로 설명 됌.

 

2. 실행부의 Max 함수를 explicit하게 호출 해 주었는데. 이를 묵시적으로 호출하게되면 에러가 발생함.

에러는 다음과 같음.

원래 목적은 다음과 같았음.

= int가 들어갈지 double이 인수로 들어갈 지 모르고, 그에따라 max값이 int or double로 반환되니, 이런 or라는 점이 템플릿의 arbitrary한 점과 결부되므로, 세가지의 typename을 사용한 것임.

 

그러나, 위에서 설명했듯이, 템플릿 함수는 아규먼트로 어떤 함수를 호출할 지 결정되므로, 아규먼트에서 모든 typename이 결정되지 않으면 어떤 템플릿 함수를 호출할지 컴파일러가 알 수 없음.

 

<typename은 1개 + 일반 함수>

<typename은 1개 + 일반 함수 / 오버로딩>

참고를 보면 알겠지만, 템플릿 함수는 일반적으로 부분특수화를 지원하지 않는다고 알려져있다.

 

그러나 이렇듯, 일반함수의 오버로딩을 사용하면 템플릿클래스의 부분특수화를 실현 할 수 있다.

 

다음 그림과 같은 생각이 든다.

 

<typename 2개 그림만>

<명시적 특수화>

(전문)

(결과)

explicit specailization 즉, 명시적 특수화는 typename이 1개일때만 가능.

 

<typename 1개 + 특수화 + 오버로딩의 불명확 문제는 저 블로그 가서>


아 다음에 포스팅하자

'컴퓨터 수업 > C++' 카테고리의 다른 글

Lambda Function  (0) 2020.11.30
템플릿★  (0) 2020.11.19
virtual , 업/다운 캐스팅, 정적타입바인딩, 추상클래스 ★  (0) 2020.11.10
C++ 상속  (0) 2020.11.05
재귀에 대한 생각.  (0) 2020.11.04