Шаблоны функций имеют большое значение при написании обобщенных алгоритмов. Существенным моментом здесь является возможность выведения типа аргументов шаблона функции по типам аргументов при ее вызове.
Компилятор может вывести аргументы, как являющиеся типами, так и обычные, при условии, что список аргументов функции однозначно идентифицирует набор аргументов шаблона. Например:
template <class T, int i> T &lookup(Buffer <T, i>&b, const char *p);
class Record
{
const char[12];
…
};
Record &f(Buffer<Record, 128> &buf, const char *p)
{
//вызвать lookup, где T – это Record, i – 128
return lookup(buf, p);
}
Для этого примера компилятор вывел, что T – Record, а i – 128.
Обратите внимание, что параметры шаблона класса, в отличие от шаблона функции, никогда не выводятся. Причина заключается в том, что гибкость, обеспечиваемая наличием нескольких конструкторов класса, во многих случаях является непреодолимым препятствием на пути такого выведения, и еще в большем числе случаев выведение неоднозначно.
Если аргумент шаблона не может быть выведен по списку аргументов шаблона функции, то мы должны указать его явно. Это делается точно так же, как и при явном задании аргументов для шаблона класса. Например:
template <class T> class Vector {…};
//создать T и вернуть указатель на него
template <class T> T*Create();
void f()
{
Vector<int> v; //класс, аргумент шаблона int
//функция, аргумент шаблона int
int *p = Create<int>();
}
Часто явная специализация используется для указания возвращаемого типа для шаблона функции.
Опубликовал Kest
September 01 2010 12:08:03 ·
0 Комментариев ·
7665 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Нет комментариев.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.