Этот пост является частью моего Руководства по C ++ для разработчиков EOS.

  1. Основы
  2. Вызов по значению / ссылке и указателям
  3. Классы и структуры
  4. Шаблоны
  5. Итераторы
  6. Лямбда-выражения
  7. Мультииндексный
  8. Заголовочные файлы

Шаблоны

Язык, имеющий статические типы, имеет множество преимуществ, поскольку ошибки могут быть обнаружены во время компиляции с помощью проверки типов. Однако это также приводит к накладным расходам при написании функций или классов, поскольку они должны быть написаны для определенного типа. Что делать, если вы пишете библиотеку и точно не знаете, как ваша библиотека будет использоваться? Если вы хотите поддерживать больше типов, вам придется повторить себя и перегрузить функцию.

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.

Вам нужно определить другую функцию для doubles:

double max(double a, double b) {
    return a > b ? a : b;
}

Как видите, функция body в обоих случаях одинакова. Важно только то, что тип реализует оператор сравнения >.

Для этих случаев использования C ++ предоставляет тип templates, общие типы, которые вы можете использовать вместо определенных. Это позволяет создавать функции или классы, функциональность которых может быть адаптирована более чем к одному типу или классу, без повторения всего кода для каждого типа.

// @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

Получайте лучшие предложения по программному обеспечению прямо в свой почтовый ящик