📕 Book/모던C++입문

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

테디슨 2021. 7. 10. 23:13

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;
    }
}
반응형