Часто бывает полезно создавать шаблоны, производные от другого шаблона. Если члены базового класса зависят от параметров шаблона производного класса, то сам базовый класс должен быть параметризирован. Например:
template <class T> class Vector{…};
template <class T> class Vec: public Vector<T> {…};
Правила разрешения перегрузки гарантируют, что функции работают правильно для таких производных типов.
Наличие одного и того же параметра шаблона для базового и производного классов, является самым распространенным случаем. Реже используется передача самого производного типа в базовый класс. Например:
template <class C> class Basic_ops
{
public:
// сравнение элементов
bool operator == (const C&) const;
bool operator != (const C&) const;
…
// обеспечивает доступ к операциям класса C
const C& derived() const
{return static_cast<const C&> (*this);}
};
template <class T> class Math_container:
public Basic_ops <Math_container<T> >
{
public:
size_t size() const;
T& operator[] (size_t);
const T& operator[] (size_t) const;
…
};
Это позволяет определить базовые операции с контейнерами один единственный раз и отделить их от определения самих контейнеров. Однако определение операций, таких как == и !=, должно быть выражено в терминах и контейнера и его элементов, поэтому базовый класс должен быть передан в шаблон контейнера.
Определение Basic_ops может выглядеть следующим образом:
template <class C>
bool Basic_ops<C>::operator==(const C&a) const
{
if (derived().size() != a.size()) return false;
for (int i=0; i<derived().size(); ++i)
if (derived()[i] != a[i]) return false;
return true;
}
Опубликовал Kest
September 07 2010 20:33:19 ·
0 Комментариев ·
10922 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Нет комментариев.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.