
лекции программирование / polevoy_cpp_2012_spring_lecture_04
.pdf
Типизированный параметр (пример)
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 |