template<class Type>
Type _min(Type a, Type b) {
if (a < b) {
return a;
}
return b;
}
int main(int argc, char** argv) {
std::cout << _min(1, 2) << std::endl;
std::cout << _min(3.1, 1.2) << std::endl;
std::cout << _min(5, 2.1) << std::endl; // oops!
return 0;
}
Решается эта проблема указанием конкретного типа при вызове функции.
#include
template<class Type>
Type _min(Type a, Type b) {
if (a < b) {
return a;
}
return b;
}
int main(int argc, char** argv) {
std::cout << _min<double>(5, 2.1) << std::endl;
return 0;
}
Когда шаблонная функция (не) будет работать?
В принципе, можно понять, что компилятор просто подставляет нужный тип в шаблон. Но всегда ли получаемая функция будет работоспособна? Очевидно, что нет. Любой алгоритм может быть определен независимо от типа данных, но он обязательно пользуется свойствами этих данных. В случае с шаблонной функцией _min это требование определения оператора упорядочения (оператор <).
Любой шаблон функции предполагает наличие определенных свойств параметризованного типа, в зависимости от реализации (например, оператора копирования, оператора сравнения, наличия определенного метода и т.д.). В ожидаемом стандарте языка С++ за это будут отвечать концепции. Перегрузка шаблона функции
Шаблоны функций также могут перегружаться. Обычно данная перегрузка выполняется при
template<class Type>
Type* _min(Type* a, Type* b){
if(*a < *b){
return a;
}
return b;
}
Частные случаи
В некоторых случаях шаблон функции является неэффективным или неправильным для определенного типа. В этом случае можно специализировать шаблон, — то есть написать реализацию для данного типа. Например, в случае со строками можно потребовать, чтобы функция сравнивала только количество символов. В случае специализации шаблона функции тип, для которого уточняется шаблон в параметре не указывается. Ниже приводится пример указанной специализации.
Do'stlaringiz bilan baham: |