ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2024.02.29 - template
    C++ 2024. 3. 4. 17:58

    아래와 같은 함수가 있다.

    int GetMax(int x, int y) {
        if (x > y) return x;
        else return y;
    }

     

    정수 둘을 받아 높은 값을 반환하는 함수다. 실수 둘을 비교하는 함수도 만들고 싶다.

    float GetMax(float x, float y) {
        if (x > y) return x;
        else return y;
    }

     

    음 좋다. short형 둘을 비교하는 함수도 만들고 싶다.

    float GetMax(short x, short y) {
        if (x > y) return x;
        else return y;
    }

     

    내친김에 double형도...

    이런식으로 만들다가는 끝이없다.

     

     

    template를 사용하면 함수의 기능은 유지하되, 자료형은 모호하게 만들 수 있다.

    #include<iostream>
    
    template <typename T>
    T GetMax(T x, T y) {
        if (x > y) return x;
        else return y;
    }
    
    int main() {
        std::cout << GetMax(1, 2) << std::endl;
        std::cout << GetMax(1.5, 2.3) << std::endl;
    }

     

    정수형은 정수형으로, 실수형은 실수형으로 받아 동작한다. 

     

     

    단, 형식 매개변수(typename)가 하나밖에 없기 때문에, 두 종류의 자료형을 매개변수로 받는 것은 불가능하다.

    #include<iostream>
    
    template <typename T>
    T GetMax(T x, T y) {
        if (x > y) return x;
        else return y;
    }
    
    int main() {
        std::cout << GetMax(1.5, 2) << std::endl;
    }

     

     

    여러개의 자료형을 매개변수로 받고 싶다면, 형식 매개변수를 늘려주면 된다.

    #include<iostream>
    
    template <typename T1, typename T2>
    void PrintGetMax(T1 x, T2 y) {
        if (x > y) std::cout << x << std::endl;
        else std::cout << y << std::endl;
    }
    
    int main() {
        PrintGetMax(1.5, 3);
    }

     

     

    class도 template로 만들 수 있다. 인스턴스를 만들때 <>안에 자료형을 넣어주어야 한다.

    #include<iostream>
    
    template <typename T>
    class Box {
    private:
        T data;
    public:
        void SetData(T d) { data = d; }
        T GetData() { return data; }
        void Print();
    };
    
    int main() {
        Box<std::string> box1;
        box1.SetData("박스");
        box1.Print();
    }
    
    template <typename T>
    void Box<T>::Print() {
        std::cout << "data = " << data << std::endl;
    }

     

     

    두 종류의 매개변수를 가지는 클래스 template도 만들 수 있다.

    #include<iostream>
    
    template <typename T1, typename T2>
    class Box2 {
    private:
        T1 firstData;
        T2 secondData;
    public:
        T1 GetFirst() { return firstData; }
        T2 GetSecond() { return secondData; }
        void SetFirst(T1 val) { firstData = val; }
        void SetSecond(T2 val) { secondData = val; }
    };
    
    int main() {
        Box2<int, float> bx;
        bx.SetFirst(1);
        bx.SetSecond(2.1);
        std::cout << bx.GetFirst() << ", " << bx.GetSecond() << std::endl;
    }

Designed by Tistory.