개발/C, C++

3_Decay

huiyu 2014. 7. 23. 03:48


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
반응형

'개발 > 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