1 minute read

🏫Chapters 12 : 템플릿 Template

템플릿

  • 같은 동작을 하지만 타입을 여러개 받을 수 있도록 만드는 틀

  • template <class T> : T에 대해 컴파일러에게 사전에 알려주기 위해 명시.

  • 예시

    template<class T>
    class mypair{
            T a, b;
        public:
            mypair(T first, T second){
                a = first;
                b = second;
            }
            T getmax();
    }

    template<class T>
    T mypair<T>::getmax(){
        T ret;
        ret = a > b ? a : b;
        return ret;
    }

    int main(void){
        mypair <int> myobj(100, 75);
        mypair <float> myobj2(75.2, 100.004);
        
        cout<< myobj.getmax();
        cout<< myobj2.getmax();
        return 0;
    }

    //return 값 : 100
  • 위에서 만약 T에 Point클래스가 들어간다면? getMax함수가 Point에 대해서도 작동하게 할 수 있을까?
    • 원칙적으로 프리미티브 타입이나 사용자 정의 타입 모두 넣을 수 있다. 그러나 모든 타입에 대해 제대로 작동하는 것은 아니다. 올바르게 동작하기 위해서는 함수의 구현에서 요구하는 오퍼레이터나 함수를 지원해주어야한다. 어떤 것을 지원해야 하는지는 매뉴얼에 나와있다.
    • 벡터 템플릿같은 경우에는 요구하는 것이 따로 없다. 벡터는 대입밖에 안하기 때문에 컴파일러가 대입연산자를 디폴트로 만들어준다.

    • 따라서 원칙적으로는 모든 타입에 대해 템플릿을 사용할 수 있기 때문에 제대로 지원만 해준다면 유용하게 사용할 수 있다.


  • EX2
    #include<iostream>
    using namespace std;

    template<class T, int N>
    class mysequence
    {
    public:
        void setmember(int x, T value);
        T getmember(int x);
    private:
        T memblock[N];
    };

    template<class T, int N>
    void mysequence<T, N>::setmember(int x, T value) {
        memblock[x] = value;
    }

    template<class T, int N>
    T mysequence<T, N>::getmember(int x) {
        return memblock[x];
    }

    int main(void) {
        mysequence<int, 5> myint;
        mysequence<double, 5> myflo;
        myint.setmember(0, 100);
        myflo.setmember(3, 3.14);
        cout << myint.getmember(0) << endl;
        cout << myflo.getmember(3) << endl;

        return 0;
    }