[모던C++입문] 3.3 클래스 템플릿
- 📕 Book/모던C++입문
- 2021. 7. 10.
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;
}
}
반응형