Data+

9. 함수 템플릿의 이해2

by Qerogram

* 함수 템플릿에서는 전문화라는 개념이 존재한다.

먼저 값이 맞는 게 있다면, 전문화된 Method를 부르기 마련이다.


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
#include <iostream>
 
using namespace std;
 
template <typename T1, typename T2> const T1& Max(const T1& a, const T2& b) {
  cout << "template 호출" << endl;
  return a > b ? a : b;
}
 
 
template <> const double& Max(const double& a, const double& b) {
  cout << "전문화 호출" << endl;
  return a > b ? a : b;
}
 
int main() {
  double Char1_MP = 300;
  double Char1_SP = 400.25;
  double MaxValue1 = Max(Char1_MP, Char1_SP);
  
  int Char2_MP = 300;
  double Char2_SP = 400.25;
  double MaxValue2 = Max(Char2_MP, Char2_SP);
  
  return 0;
}
cs


* 결과

전문화 호출
template 호출


- 한번 더 실험을 해보았다.

Max(10.1, 20.4)를 호출한다면 Max(T, T)가 호출이 될까? Max(double, double)이 호출이 될까?


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
using namespace std;
 
template <typename T1, typename T2> const T1& Max(const T1& a, const T2& b) {
  cout << "template 호출" << endl;
  return a > b ? a : b;
}
 
 
template <> const double& Max(const double& a, const double& b) {
  cout << "전문화 호출" << endl;
  return a > b ? a : b;
}
 
int main() {
  cout << Max(10.120.4<< endl;
 
  return 0;
}
cs


* 결과

전문화 호출
20.4


- 생각한 대로, 전문화된 Method를 호출하였다. 이유는, 호출 순서에 규칙이 존재한다.

1순위. 전문화된 Method

2순위. 템플릿 Method

3순위. 일반 Method.


* Non-type 함수 템플릿.

- 게임에서 돈, HP, 경험치를 이벤트시에 더 주는 걸 예시로 해보겠다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
 
using namespace std;
 
template <typename T, int VAL> T AddValue(T const& CurValue) {
  return CurValue + VAL;
}
 
const int EVENT_ADD_HP_VALUE = 50;
const int EVENT_ADD_EXP_VALUE = 30;
const int EVENT_ADD_MONEY_VALUE = 10000;
 
int main() {
  int Char_HP = 250;
  cout << Char_HP <<"에서 이벤트에 의해 " << AddValue<int, EVENT_ADD_HP_VALUE>(Char_HP) << endl;
  
  float Char_Exp = 378.89f;
  cout << Char_Exp << "에서 이벤트에 의해 " << AddValue<int, EVENT_ADD_EXP_VALUE>(Char_Exp) << endl;
 
  int Char_MONEY = 34567890;
  cout << Char_MONEY << "에서 이벤트에 의해 " << AddValue<int, EVENT_ADD_MONEY_VALUE>(Char_MONEY) << endl;
  
  return 0;
}
cs


* 결과

250에서 이벤트에 의해 300
378.89에서 이벤트에 의해 408
34567890에서 이벤트에 의해 34577890



* 참고 - Thinking About C++ STL Programming

'코딩 > C&C++' 카테고리의 다른 글

11. 클래스 템플릿의 이해2  (0) 2017.04.15
10. 클래스 템플릿의 이해1  (0) 2017.04.14
8. 함수 템플릿의 이해1  (0) 2017.04.13
7. Merge sort(합병정렬)  (0) 2017.04.10
6. Quick Sort  (0) 2017.04.10

블로그의 정보

Data+

Qerogram

활동하기