본문 바로가기

study

C++ 템플릿

템플릿(template)

 - C++에서는 함수의 다형성의 원리에 따라 같은 이름을 가졌어도 인수가
   다르면 다른 함수를 호출하게 되어있다.

   Ex)
      ACCESS(int x, int y) { return(x+y); }
      ACCESS(long x, long y) { return(x+y); }
      ACCESS(float x, float y) { return(x+y); }

   사용자가 실매개변수를 어떤 형으로 전달해주는가에 따라서 바인딩되는
   함수가 결정되는 것이다.  이런 방법은 상당히 여러가지 낭비를 초래한
   다.  이런 경우 템플릿을 이용한다.

      ACCESS(T x,T y) { return(x+y); }

   T는 상황에 따라서 데이터형까지 결정해주는 틀,  즉 템플릿(template)
   이다.. 템플릿에는 함수 템플릿과 클래스 템플릿이 있다.

 - 함수 템플릿
   - 다음과 같이 선언하면 정의되어진 함수는 템플릿 함수가 된다.

   [ 형식 ]
      template<템플릿인수1, 템플릿인수2..> 함수의 정의

   Ex)
      template <class T> void ACCESS(T arg) {...}

   - 템플릿 인수 리스트는 인자형을 대신할 변수들을 의미하며 위의 예에
     서 class는 단지 템플릿인자임을 나타내는 기호이고 클래스를 나타내
     는 것과는 성격이 다르다.
   - inline, static, extern등의 키워드들은 함수명 바로앞에 기술한다.
   - 템플릿 인수리스트에 선언된 인자들은 최소한 1번 이상 쓰여야 한다.
   - 인수 리스트에는 수식, 함수등이 올 수도 있다.
   - 템플릿 함수와 일반함수가 중복되었을 경우에는 일반함수가 우선적으
     로 호출되어진다.
   - 템플릿함수나 일반함수로도 생성될 수 없는  함수가 호출되면 에러가
     발생한다.  이러한 경우는 이 때의 함수  프로토타입다음을 선언하여
     주면 된다.

      template<class T, class T> T ACCESS(T a, T b) { ... }
      ACCESS(1, 2.3);                     // 에러

      template<class T, class T> T ACCESS(T x, T y) { ... }
      double ACCESS(double, double);      // 템플릿 확장
      ACCESS(3, 3.14);
      // 자동 형변환에 의해 ACCESS(double(3), 3.14)로 인식되어진다.

   - 템플릿함수도 다형성이 적용된다.

      template<class T> T ACCESS(T,T);
      template<class T> T ACCESS(T,T,int);

   Ex)
      #include <stdio.h>

      template<class T> T ACCESS(T x, T y)
      {
          return(x>y ? x:y);
      }

      template<class F, class E> F PRM(F x, E y) { return (x + y); }

      void main()
      {
          printf("%d\n", sub(3, 4));
          printf("%g\n", sub(5.5, 6.8));
          printf("%d\n", func(4, 5.4));
          printf("%g\n", func(3.3, 7));
      }

 - 클래스 템플릿
   - 템플릿 함수와 비슷한 내용이다. 클래스 멤버들을 템플릿으로 지정할
     수있는 방법이다.

   [ 형식 ]
      template<템플릿인수1, 템플릿인수2..> 클래스의 정의

   Ex)
      template<class T>
      class ACCESS {
          protected:
          int x, y;
          T z;
          public:
          ACCESS(int a, int b, T c) {
              x = a; y = b; z = c;
          }
          void OUT(void) {
              gotoxy(x,y); cout << z; }
          } ;
               :
      ACCESS<int> var1(5, 5, 10);
      ACCESS<char> var2(10, 10, 'A');
      ACCESS<float> var3(15, 20, 3.14);
               :

   - 인수리스트의 인수중에는 사용되지 않은 것이 존재해도 상관없다.
   - 위의 보기와 같이 < >사이에 사용자가 사용하고자 하는 자료형을  지
     정 해주어야 한다.
   - 클래스 템플릿에서도static멤버나 함수의 외부정의를 사용할 수 있다
     이러한 경우에는 다음과 같다.

      template<class T>
      class ACCESS {
          static int s;
          int x, y;
          T z;
      };
      template<class T> int ACCESS<T>::s=0; // static멤버의 정의
      template<class T> ACCESS<T>::ACCESS(int a, int b, T c)

      { x = a; y = b; z = c; }
      // 위의 예에서 생성자를 외부정의로 한 것




출처 : Tong - 우울쟁이님의 Language Information통