Спецификации шаблона
template объявление определяет набор параметризованных классов или функций.
template < template-parameter-list > declaration
Заметки
Шаблон-параметр-список разделенный запятыми список параметров шаблона, которые могут быть типами (в форме классИдентификатор" TypeNameИдентификаторили шаблон < шаблон-параметр-список класс > Идентификаторпараметры) или non-типа, используемый в теле шаблона.Синтаксис для параметров шаблона одно из следующих действий:
parameter-declaration
class identifier [ = typename ]
typename identifier [ = typename ]
template < template-parameter-list > class [identifier][= name]
Можно создать шаблон, как создать экземпляр класса более обычный класс, но необходимо включить аргументы шаблона в угловые скобки (<>).Эти аргументы шаблона могут быть любым типом, если список аргументов шаблона содержит класс или TypeName ключевое слово или значение соответствующего типа если аргумент аргумент non-типа.Необходим, что вызывает шаблон функции отсутствует специальный синтаксис, хотя угловых скобок и аргументов шаблона могут быть необходимы, если параметры шаблона не может вывести из аргументов функции.
шаблон-параметр-список список параметров, используемых функцией шаблона, которая определяет, какие части следующего кода различаются.Примеры.
template< class T, int i > class MyStack...
В этом случае шаблон может получить тип (class Tконстанты () и параметрint i).Шаблон будет использовать тип T и постоянно целое число i для создания экземпляра.В теле MyStack объявление, необходимо сослаться на T идентификатора.
Само объявление шаблона не создает код; оно указывает семейство классов и функций, одного или нескольких из которых будет создаваться при реализации на другой код.
Объявления шаблона имеют глобальным пространством имен или область класса.Их нельзя объявлять внутри функции.
В следующем примере показано объявление определение и экземпляр шаблона класса с параметром типа T и параметр шаблона non-типаi.
// template_specifications1.cpp
template <class T, int i> class TestClass
{
public:
char buffer[i];
T testFunc(T* p1 );
};
template <class T, int i>
T TestClass<T,i>::testFunc(T* p1)
{
return *(p1++)
};
// To create an instance of TestClass
TestClass<char, 5> ClassInst;
int main()
{
}
Аргументы шаблона Non-типа
Параметры шаблона должны быть Non-типа целочисленные, перечисления, указателей, ссылки или указателя на тип элемента и должны быть постоянными во время компиляции.Их можно указывать как const или volatile типы.Не допускаются значения с плавающей запятой в качестве параметров шаблона.Объекты типа класса, структуры или объединения не допускаются в качестве параметров шаблона non-типа, хотя указатели на те объекты допускаются.Массивы, передаваемые в качестве параметров шаблона non-типа преобразованы в указатели.Функции, переданные как параметры non-типа рассматриваются как указатели функций.Строковые литералы не допускаются в качестве параметров шаблона.
Использование typename в объявлении шаблона
TypeName ключевое слово можно использовать в списке параметров шаблона.Следующие объявления шаблона идентичны:
template< class T1, class T2 > class X...
template< typename T1, typename T2 > class X...
Аргументы по умолчанию для параметров шаблона
Шаблоны классов могут иметь определенные с помощью аргументов по умолчанию = символ, за которым следует тип или значение по умолчанию.Шаблоны функции не могут иметь аргументы по умолчанию.Дополнительные сведения см. в разделе Аргументы по умолчанию для шаблонов класса .:
template<typename Type> class allocator {};
template<typename Type,
typename Allocator = allocator<Type> > class stack
{
};
stack<int> MyStack;
Повторное использование параметров шаблона
Параметры шаблона можно использовать повторно в списке параметров шаблона.Например, в следующем коде допускается.
// template_specifications2.cpp
class Y
{
};
template<class T, T* pT> class X1
{
};
template<class T1, class T2 = T1> class X2
{
};
Y aY;
X1<Y, &aY> x1;
X2<int> x2;
int main()
{
}
Шаблоны в качестве параметров шаблона
Параметры шаблона могут шаблоны.Такой подход означает, что аргумент должен быть шаблоном, а не класс, полученный из шаблона.В следующем примере имя A параметр шаблона для параметра шаблона шаблона может быть опущен, поскольку не существует способа что его можно использовать.
// template_specifications3.cpp
#include <stdio.h>
template <class T> struct str1
{
T t;
};
template <template<class A> class T> struct str2
{
T<int> t;
};
int main()
{
str2<str1> mystr2;
mystr2.t.t = 5;
printf_s("%d\n", mystr2.t.t);
}
Output
5
Ссылки в качестве параметров шаблона
Visual Studio .NET 2003 появилась возможность использовать ссылки в качестве параметров шаблона non-типа.Это не допускается в предыдущих версиях.
// references__supported_as_nontype_template_parameters.cpp
#include <stdio.h>
extern "C" int printf_s(const char*,...);
template <int & ri> struct S
{
S()
{
printf_s("ri is %d\n", ri);
}
~S()
{
printf_s("ri is %d\n", ri);
}
};
int i = 1;
int main()
{
S<i> s;
i = 0;
}
Output
ri is 1
ri is 0
Вложенные экземпляры шаблонов
Visual Studio до версии Visual Studio 2005 требуют, чтобы использовался пробел между списками параметров шаблона, когда вложенных экземпляров шаблона были объявлены.Теперь допустим следующий синтаксис:
// template_specifications4.cpp
template <typename T>
class A
{
};
template <int n>
class B
{
};
int main()
{
A<B<22>>();
}