Этот пост является частью моего Руководства по C ++ для разработчиков EOS.
- Основы
- Вызов по значению / ссылке и указателям
- Классы и структуры
- Шаблоны
- Итераторы
- Лямбда-выражения
- Мультииндексный
- Заголовочные файлы
Шаблоны
Язык, имеющий статические типы, имеет множество преимуществ, поскольку ошибки могут быть обнаружены во время компиляции с помощью проверки типов. Однако это также приводит к накладным расходам при написании функций или классов, поскольку они должны быть написаны для определенного типа. Что делать, если вы пишете библиотеку и точно не знаете, как ваша библиотека будет использоваться? Если вы хотите поддерживать больше типов, вам придется повторить себя и перегрузить функцию.
int max(int a, int b) {
return a > b ? a : b;
}
max(5, 3); // works
max(5.0, 3.0) // does not work as these are _double_s and not _int_s.
Вам нужно определить другую функцию для double
s:
double max(double a, double b) {
return a > b ? a : b;
}
Как видите, функция body в обоих случаях одинакова. Важно только то, что тип реализует оператор сравнения >
.
Для этих случаев использования C ++ предоставляет тип template
s, общие типы, которые вы можете использовать вместо определенных. Это позволяет создавать функции или классы, функциональность которых может быть адаптирована более чем к одному типу или классу, без повторения всего кода для каждого типа.
// @url: https://repl.it/@MrToph/CPPBasics-Templates
#include <iostream>
// create a "function-template" with template type T
// T can now be used as any other type like int
template<class T>
T max(T a, T b)
{
return a > b ? a : b;
}
// create a "class-template"
// class members can now be of the template type T
template <class T>
class pair {
T values[2];
public:
pair(T first, T second)
{
values[0]=first;
values[1]=second;
}
T first() const;
T second() const;
};
// must use template<class T> syntax here again
template <class T>
T pair<T>::first() const {
return values[0];
}
template <class T>
T pair<T>::second() const {
return values[1];
}
int main()
{
int iMax = max(3, 5);
double dMax = max(3.0, 5.0);
// class template instantiations are done
// by passing the type in angle brackets
pair<int> p(3, 5);
std::cout << max(p.first(), p.second());
}
За кулисами происходит то же самое, что мы делали раньше вручную. Будучи статически типизированным, код анализируется, и типы для любого вызова функции шаблона могут быть разрешены. Затем компилятор создает экземпляр функции для каждого конкретного используемого типа.
Первоначально опубликовано на cmichel.io
Получайте лучшие предложения по программному обеспечению прямо в свой почтовый ящик