Decay현상
템플릿을 만들 때 T로 받으면
배열->포인터,
함수->함수포인터
로 암시적 변환되어 전달됩니다.
C가 만든 규칙을 따르기 위해 이렇게 동작, 이를 "Decay"라고 부릅니다.
template<typename T> void foo( T a ) { // T가 어느 타입인지 알 수 있다. cout << typeid(T).name() << endl; } int main() { int n = 10; int x[10]; foo( n ); // T는 int!! foo( "hello");// char const * foo( x); // int * foo(main); // int(*)(void) }
T를 참조로 받는다면?
//template<typename T> void foo( T a ) template<typename T> void foo( T& a ) { cout << typeid(T).name() << endl; } int main() { int n = 10; int x[10]; foo( n ); // T는 int!! foo( "hello");// char const[6] foo( x); // int[10] foo(main); // int(void) }
배열->배열, 함수->함수로 정확히 전달된다.
다음의 경우에는 글자수가 달라 실행이 되지 않는다.
template<typename T> void goo( T& a, T& b) { } int main() { goo( "banana", "apple"); }
이럴 때는 문자열 전용 버전을 제공하면 된다.
void goo( const char* s1, const char* s2) { }
일반적으로 함수를 찾는 순서는
1. 일반함수를 먼저 찾고
2. 없으면 template을 사용한다.
728x90
'Software Development > C, C++' 카테고리의 다른 글
C언어로 게임만들기 - 1. 게임 기본구조 (3) | 2017.03.14 |
---|---|
현재 디렉토리 경로 알아오기 (0) | 2014.10.20 |
2_new_정리 (0) | 2014.07.23 |
2_new4_Placement new (0) | 2014.07.23 |
2_new3_nothrow (0) | 2014.07.23 |