[모던C++입문] 3.3 클래스 템플릿

    3.3 클래스 템플릿

    컨테이너 예제

    • 템플릿을 사용하여 제네릭 클래스를 만들어보자
    template <typename T>
    class vector 
    {
      public:
        explicit vector(int size)       //암시적 변환을 막음 explicit
          : my_size(size), data( new T[my_size] )
        {}
    
        vector()
          : my_size(0), data(0)
        {}
    
        vector(const vector& that)
          : my_size(that.my_size), data(new T[my_size])
        {
            std::copy(&that.data[0], &that.data[that.my_size], &data[0]);
        }
    
        int size() const { return my_size; }
    
        const T& operator[](int i) const 
        {
            check_index(i);
            return data[i];
        }
    
      private:
        int                   my_size;
        std::unique_ptr<T[]>  data;
    };

    유니폼 클래스 및 함수 인터페이스 디자인

    진정한 배열의 합

    template <typename T>
    T sum(const T* array, int n)
    {
        T sum(0);
        for (int i= 0; i < n; i++)
        sum += array[i];
        return sum;
    }
    
    int ai[] = {2, 4, 7};
    double ad[] = {2., 4.5, 7.};
    cout << "sum ai is " << sum(ai, 3) << endl;
    cout << "sum ad is " << sum(ad, 3) << endl;

    요소들의 합을 제네릭 함수로 구현하기

    • 반복자(iterator)를 만들자
      • ++it 를 사용하여 시퀀스를 순회
      • *it를 사용하여 값에 접근
      • ==이나 !=를 사용해 반복자를 비교
    template <typename T>
    struct list_iterator
    {
        list_iterator(list_entry<T>* entry) : entry(entry) {}
    
        T& operator*() { return entry->value; }
        const T& operator*() const { return entry->value; }
    
        list_iterator<T> operator++() 
        { entry= entry->next; return *this; }
    
        bool operator!=(const list_iterator<T>& that) const 
        { return entry != that.entry; }
    
    
    
        list_entry<T>* entry;
    };
    
    template <typename T>
    struct list
    {
        list_iterator<T> begin() { return list_iterator<T>(first); }
        list_iterator<T> end() { return list_iterator<T>(0); }
    }
    
    int main()
    {
        list l1;
        int sum = 0;
        for(list_iterator it = l1.begin(); it != l1.end(); ++it)
        {
            sum += *it;
        }
    }
    반응형

    댓글

    Designed by JB FACTORY