Стандарт разрешает в качестве параметров шаблона задавать параметры, не являющиеся типами (см. п. п. 14.1/4 в [1]). Такими параметрами могут быть:
• объект интегрального (integral) или перечислимого типа;
• указатель на объект или указатель на функцию;
• ссылка на объект или ссылка на функцию;
• указатель на член класса.
К интегральным типам относятся все целочисленные и символьные типы, а также булев тип. Как видите, нельзя использовать в качестве параметра ни один из встроенных дробных типов: ни float, ни double, ни long double.
ПРИМЕЧАНИЕ :
Наиболее часто применяются целочисленные параметры, с помощью которых обычно задают некоторое количественное значение, например количество элементов контейнера-массива.
В библиотеке Boost (и в [29]) приводится пример шаблонного класса array, который предлагается использовать вместо встроенных массивов. Напишем упрощенную версию TSimpleArray этого шаблона (листинг 11.4). Пока не будем обращать внимание на эффективность расходования памяти и зададим массив как поле класса. Это позволит нам не определять ни конструктор копирования, ни оператор присваивания. Однако конструктор инициализации определим, чтобы не заполнять массив путем присваивания. Из операций достаточно определить операцию индексирования operator [] для доступа к элементам массива (как обычно, в двух вариантах).
Очевидно, тип элементов можно сделать параметром шаблона. Вторым претендентом в параметры является размер массива. Таким образом, заголовок шаблона может выглядеть так:
template <typename T, std::size_t N>
Точно такие же заголовки нужно будет писать и во внешних определениях методов. Тип size_t определен в библиотеке <cstddef> как unsigned int, поэтому нам нет нужды использовать оператор typedef для сокращения записи.
Листинг 11.4. Применение шаблона для реализации массива #include <stdexcept>
template<typename Т, std::size_t N> // параметры шаблона
class TSimpleArray { public: // типы
typedef T value_type;
В [28] высказано предположение двух членов Комитета по стандартизации (Н. Джо-саттиса и Д. Вандевурда), что в будущих версиях стандарта это недоразумение будет исправлено. |