C++/summary

함수 템플릿

gandus 2010. 10. 11. 09:51
  • 템플릿(template): 물건을 만들 때 사용되는 틀이나 모형을 의미
  • 함수 템플릿(function template): 함수를 찍어내기 위한 형틀
클래스 템플릿


int get_max(int x, int y)

{

           if( x > y ) return x;

           else return y;

}

타입만 바뀌면 다른 타입도 만들 수 있다.

  • 일반화 프로그래밍(generic programming): 일반적인 코드를 작성하고 이 코드를 정수나 문자열과 같은 다양한 타입의 객체에 대하여 재사용하는 프로그래밍 기법


->>>>>

함수 템플릿

template<typename T>        //  모두 T니깐 모두 같은 타입이어야 한다.

T get_max(T x, T y)

{

           if( x > y ) return x;

           else return y;

}

사용시는

get_max(1,3) 이렇게 하면 - ->> 자동적으로  int get_max( int x, int y )  이런식으로 만들어 진다
->>> 컴파일러가 자동적으로 만든다.



함수 템플릿의 특수화


template <typename T>             // 함수 템플릿으로 정의

void print_array(T[] a, int n)        // 타입에 종속적이지 않다.

{

           for(int i=0;i<n; i++)

                     cout << a[i] << " ";

           cout << endl;

}

template <>                 // 템플릿 특수화

void print_array(char[] a, int n)     // 매개 변수가 char인 경우에는 이 함수가 호출된다.

{

           cout << a << endl;

}



이건 특수화가 아니라 중복정의이다.




특수화랑 중복정의랑 차별점은 ??
->  특수화는 이름 같고, 템플릿 함수의 한부분을 빼둔것이다.  범용적으로 사용이 가능한데, 재정의 처럼 한것이다.

->   중복정의는 ( 레퍼런스로 받을때는 변수의 이럼을 받는다 )
     서로 다른 형을 받는다  레퍼런스  < -- >   포인터




두 개의 타입 매개 변수를 가지는 함수 템플릿
 



->  큰 타입이 작은 타입으로 대입되면 안된다.   일반화 시킬때 조심해야 한다.




특수화를 이용한 소스코드

template <typename T>

void printArr( T a[], int n ){

      for(int i=0; i< n; i++)

            cout<<a[i] << " ";

     

      cout<<endl;

}

 

template <>       // 특수화

void printArr( char a[], int n ){  // 문자배열이오면이걸로실행된다

      cout<<a <<endl;                          // 컴파일러가알아서함수만들어서실행

}

 

void main(){

     

      int a[10] = { 1,2,3,4,5,6,7,8,9,10 };

      char b[] = "char is arr";

 

      printArr( a, 10 );

      printArr( b, sizeof(b) );

}