Шаблоны классов: List<T>

Один и тот же класс работает с любым типом данных. Переключайте тип и смотрите, как один шаблонный код обслуживает списки целых, вещественных, строковых и символьных данных.

template<class T> Generics Инстанцирование

Какой тип данных будет хранить список?

Тип T заменяется компилятором на выбранный. Код шаблона при этом не меняется.

Список List<int>

Список пуст.

Операции

Совет. Для типа string попробуйте значения apple, banana, cherry. Для char — одиночные буквы.

Один шаблон — два представления

Слева — сам шаблон класса (не меняется). Справа — код, который создаёт конкретный объект List<T> и вызывает его методы (тип T подставляется).

Шаблон (не меняется)
template<class T>
class List {
    struct Node {
        T data;
        Node* next;
        Node(T d) : data(d), next(0) {}
    };
    Node* head;
public:
    List() : head(0) {}
    ~List();
    void Add(T value);
    bool Remove(T key);
    Node* Find(T key);
    void Print();
};
Использование с типом int
Что происходит во время компиляции. Когда вы пишете List<int> l;, компилятор создаёт отдельную версию класса, где вместо T стоит int. Для List<double> — свою. Это называется инстанцированием шаблона. Код шаблона при этом пишется один раз, а работает с любым типом.

Задание

  1. Создайте список целых и добавьте числа 10, 20, 30. Убедитесь, что все они видны.
  2. Переключитесь на double — что произошло со списком? Почему?
  3. Для типа string добавьте три разных слова. Как изменился код использования?
  4. Почему нельзя в одном объекте List<int> хранить числа, а строки — нет?
  5. Напишите шаблон класса Pair<A, B>, который хранит два значения разных типов.