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


Спецификации шаблона

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);
}

x5w1yety.collapse_all(ru-ru,VS.110).gifOutput

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;
}

x5w1yety.collapse_all(ru-ru,VS.110).gifOutput

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>>();
}

См. также

Ссылки

Ключевые слова C++

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

Шаблоны