Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

лекции программирование / polevoy_cpp_2012_spring_lecture_04

.pdf
Скачиваний:
30
Добавлен:
20.04.2015
Размер:
112.14 Кб
Скачать

Типизированный параметр (пример)

template<class T, size_t N> class CArr

{

private:

T m_data[N];

};

CArr<int, 128> members;

03.03.2012

www.cppNewb.ru

21

Проверка

при определении шаблона

ошибки, которые можно обнаружить вне зависимости от конкретного набора аргументов

при инстанциировании шаблона

ошибки, которые имеют отношение к использованию параметров

03.03.2012

www.cppNewb.ru

22

Слабая типизация

тип обеспечивает интерфейс, ожидаемый шаблоном

требуется доступность вызываемых функций для типов, параметризующих шаблоны

03.03.2012

www.cppNewb.ru

23

Слабая типизация (пример)

template<typename T> T

min(const T& lhs, const T& rhs)

{

return (lhs < rhs) ? lhs : rhs;

}

03.03.2012

www.cppNewb.ru

24

Параметры шаблона функции

могут быть выведены компилятором, если однозначно определяются списком аргументов

могут быть указаны явно

пример:

int minVal(minimum<int>(a, b));

03.03.2012

www.cppNewb.ru

25

Параметры шаблона класса

должны указываться явно, т.к. никогда не выводятся

пример:

vector<int> marks;

для выведения списка параметров м.б. использована генерирующая экземпляры шаблонного класса функция

пример:

make_pair(a, b)

03.03.2012

www.cppNewb.ru

26

Автоматическая генерация экземпляров шаблонного класса

template <class T1, class T2> struct pair ;

template <class T1,class T2> pair<T1,T2>

make_pair(const T1& x, const T2& y)

{

return pair<T1, T2>(x, y);

}

03.03.2012

www.cppNewb.ru

27

Перегрузка функций

можно объявлять

несколько шаблонов с одним именем

комбинацию шаблонов и обычных функций

с одним именем

выбор функции

явный квалификатор (параметры шаблона)

разрешение вызова

03.03.2012

www.cppNewb.ru

28

Перегрузка функций (пример)

template<typename T> T sqrt(T);

template<typename T>

complex<T> sqrt(const complex<T>&);

double sqrt(double);

03.03.2012

www.cppNewb.ru

29

Параметр шаблона по умолчанию (пример)

template <class T> class CStr; //< строки

template <class T> class СCmp; //< сравнитель символов

template <class T>

int compare(const CStr<T>& lhs, const CStr<T>& rhs);

template <class T, class C>

int compare(const CStr<T>& lhs, const CStr<T>& rhs);

или

template <class T, class C = СCmp<T>>

int compare(const CStr<T>& lhs, const CStr<T>& rhs);

03.03.2012

www.cppNewb.ru

30