Поделиться через


Общие сведения о шаблонах

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

Заметки

Например, чтобы создать typesafe функция, которая возвращает минимум 2 параметров без использования шаблонов можно написать набор перегруженных функций так:

// what_are_templates1.cpp
// compile with: /c
// min for ints
int min( int a, int b ) {
   return ( a < b ) ? a : b;
}

// min for longs
long min( long a, long b ) {
   return ( a < b ) ? a : b;
}

// min for chars
char min( char a, char b ) {
   return ( a < b ) ? a : b;
}

С помощью шаблонов, можно уменьшить избыточность к одному шаблону это функции:

// what_are_templates2.cpp
// compile with: /c
template <class T> T min( T a, T b ) {
   return ( a < b ) ? a : b;
}

Шаблоны могут значительно сократить размер исходного кода и повысить гибкость кода без снижения безопасности типа.

2 Основных типа шаблонов: шаблоны функции и шаблоны класса.В предыдущем примере min шаблон функции.Шаблон класса класс с параметром, например:

// what_are_templates3.cpp
template <class T> class A {
   T m_t;
   public:
      A(T t): m_t(t) {} 
      void f(T t);
};

int main() {
   A<int> a(10);
}

Шаблоны объявляются и определены несколько как и другие функции и классы, с некоторыми основными отличиями.Объявление шаблона не полностью определяет функцию или класс. оно определяет только синтаксический основу для класса или функции.Фактические класс и функция созданных из шаблона процессом, называемым создания экземпляра.Отдельные, созданные классы или функции называются создать экземпляр.Например, шаблон класса:

template <class T> struct A { . . . };

может использоваться для создания экземпляров классов A<int>" A<char>" A<int*>" A<MyClass*>и т д

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

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

// what_are_templates4.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;

template <int i> class A {
   int array[i];
public:
   A() { memset(array, 0, i*sizeof(int)); }
};

int main() {
   A<10> a;
}

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

См. также

Другие ресурсы

Шаблоны