Язык программирования C++ для профессионалов


         

При генерации по шаблону типа


При генерации по шаблону типа ссылки, используемые подобным образом, приведут ошибкам в типах. Генерация по шаблону типа для функции

Slist::insert(T&);

приведет к появлению недопустимой функции

Slist::insert(shape&&);

Ссылка не является объектом, поэтому нельзя иметь ссылку на ссылку.

Поскольку список указателей является полезной конструкцией, имеет смысл дать ему специальное имя:

template<class T> class Splist : private Slist<void*> { public: void insert(T* p) { Slist<void*>::insert(p); } void append(T* p) { Slist<void*>::append(p); } T* get() { return (T*) Slist<void*>::get(); } };

class Isplist : private slist_base { public: void insert(T* p) { slist_base::insert(p); } void append(T* p) { slist_base::append(p); } T* get() { return (T*) slist_base::get(); } };

Эти определения к тому же улучшают контроль типов и еще больше сокращают необходимость дублировать функции.

Часто бывает полезно, чтобы тип элемента, указываемый в шаблоне типа, сам был шаблонным классом. Например, разреженную матрицу, содержащую даты, можно определить так:

typedef Slist< Slist<date> > dates;

Обратите внимание на наличие пробелов в этом определении. Если между первой и второй угловой скобкой > нет пробелов, возникнет синтаксическая ошибка, поскольку >> в определении

typedef Slist<Slist<date>> dates;

будет трактоваться как операция сдвига вправо. Как обычно, вводимое в typedef имя служит синонимом обозначаемого им типа, а не является новым типом. Конструкция typedef полезна для именования для длинных имен шаблонных классов также, как она полезна для любых других длинных имен типов.

Отметим, что параметр шаблона типа, который может по разному использоваться в его определении, должен все равно указываться среди списка параметров шаблона один раз. Поэтому шаблон типа, в котором используется объект T и список элементов T, надо определять так:

template<class T> class mytemplate { T ob; Slist<T> slst; // ... };

а вовсе не так:

template<class T, class Slist<t> > class mytemplate { T obj; Slist<T> slst; // ... };

В §8.6 и §R.14.2 даны правила, что может быть параметром шаблона типа.


Содержание  Назад  Вперед





Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий