~~~~~~~~~~~~~~~~~~~~ Arc.Ask3.Ru ~~~~~~~~~~~~~~~~~~~~~ 
Номер скриншота №:
✰ D286CDE417ED8537F80A3520241FEE5A__1712341980 ✰
Заголовок документа оригинал.:
✰ Template (C++) - Wikipedia ✰
Заголовок документа перевод.:
✰ Шаблон (C++) — Википедия ✰
Снимок документа находящегося по адресу (URL):
✰ https://en.wikipedia.org/wiki/Template_(programming) ✰
Адрес хранения снимка оригинал (URL):
✰ https://arc.ask3.ru/arc/aa/d2/5a/d286cde417ed8537f80a3520241fee5a.html ✰
Адрес хранения снимка перевод (URL):
✰ https://arc.ask3.ru/arc/aa/d2/5a/d286cde417ed8537f80a3520241fee5a__translat.html ✰
Дата и время сохранения документа:
✰ 21.06.2024 13:34:53 (GMT+3, MSK) ✰
Дата и время изменения документа (по данным источника):
✰ 5 April 2024, at 21:33 (UTC). ✰ 

~~~~~~~~~~~~~~~~~~~~~~ Ask3.Ru ~~~~~~~~~~~~~~~~~~~~~~ 
Сервисы Ask3.ru: 
 Архив документов (Снимки документов, в формате HTML, PDF, PNG - подписанные ЭЦП, доказывающие существование документа в момент подписи. Перевод сохраненных документов на русский язык.)https://arc.ask3.ruОтветы на вопросы (Сервис ответов на вопросы, в основном, научной направленности)https://ask3.ru/answer2questionТоварный сопоставитель (Сервис сравнения и выбора товаров) ✰✰
✰ https://ask3.ru/product2collationПартнерыhttps://comrades.ask3.ru


Совет. Чтобы искать на странице, нажмите Ctrl+F или ⌘-F (для MacOS) и введите запрос в поле поиска.
Arc.Ask3.ru: далее начало оригинального документа

Шаблон (C++) — Википедия Jump to content

Шаблон (С++)

Из Википедии, бесплатной энциклопедии
(Перенаправлено из Шаблон (программирование) )

Шаблоны — это функция языка программирования C++ , которая позволяет функциям и классам работать с универсальными типами . функции или класса Это позволяет объявлению ссылаться через общую переменную на другой класс (встроенный или недавно объявленный тип данных ) без создания полного объявления для каждого из этих разных классов.

Проще говоря, шаблонный класс или функция будет эквивалентом (перед «компиляцией») копирования и вставки шаблонного блока кода, где он используется, а затем замены параметра шаблона фактическим. По этой причине классы, использующие шаблонные методы, помещают реализацию в заголовки (файлы *.h), поскольку ни один символ не может быть скомпилирован без предварительного знания типа.

Стандартная библиотека C ++ предоставляет множество полезных функций в рамках связанных шаблонов.

Основным источником вдохновения для шаблонов C++ послужили параметризованные модули, предоставляемые языком CLU , и дженерики, предоставляемые Ada . [1]

Технический обзор [ править ]

Существует три типа шаблонов: шаблоны функций , шаблоны классов и, начиная с C++14 , шаблоны переменных . Начиная с C++11 , шаблоны могут быть либо вариативными , либо невариативными; в более ранних версиях C++ они всегда невариативны.

Шаблоны функций [ править ]

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

шаблон  <  класса   идентификатор  >   объявление  ; 
  шаблон  <  имени типа   идентификатор  >   объявление  ; 

Оба выражения имеют одно и то же значение и ведут себя совершенно одинаково. Последняя форма была введена во избежание путаницы. [2] поскольку параметр типа не обязательно должен быть классом до C++20. (Это может быть базовый тип, например int или double.)

Например, стандартная библиотека C++ содержит шаблон функции max(x, y) который возвращает большее из x и y. Этот шаблон функции можно определить следующим образом:

шаблон  <  имя типа   T  >   T   max  (  T   &  a  ,   T   &  b  )   {   return   a   >   b   ?    а   :   б  ;    } 

Это единственное определение функции работает со многими типами данных. В частности, он работает со всеми типами данных, для которых определен > (оператор «больше»). Использование шаблона функции экономит место в файле исходного кода, а также ограничивает изменения одним описанием функции и упрощает чтение кода.

Однако шаблон не создает объектный код меньшего размера по сравнению с написанием отдельных функций для всех различных типов данных, используемых в конкретной программе. Например, если программа использует как int и double версия max() шаблон функции, показанный выше, компилятор создаст версию объектного кода max() который действует на int аргументы и другую версию объектного кода, которая работает с doubleаргументы. Вывод компилятора будет идентичен тому, который был бы получен, если бы исходный код содержал две отдельные нешаблонные версии max(), один написан для обработки int и один написан для обработки double.

Вот как можно использовать шаблон функции:

#include   <iostream> 

 int   main  ()   { 
     // Это вызовет max<int> путем неявного вывода аргументов. 
      std  ::  cout   <<   max  (  3  ,   7  )   <<   '\n'  ; 

      // Это вызовет max<double> путем неявного вывода аргументов. 
      std  ::  cout   <<   max  (  3.0  ,   7.0  )   <<   '\n'  ; 

      // Нам нужно явно указать тип аргументов; 
      // хотя std::type_identity мог бы решить эту проблему... 
     std  ::  cout   <<   max  <  double  >  (  3  ,   7.0  )   <<   '\n'  ; 
  } 

В первых двух случаях аргумент шаблона T автоматически выводится компилятором как int и double, соответственно. В третьем случае автоматический вычет max(3, 7.0)потерпит неудачу, поскольку тип параметров, как правило, должен точно соответствовать аргументам шаблона. Поэтому мы явно создаем экземпляр double версия с max<double>().

Этот шаблон функции может быть создан с использованием любого типа , допускающего копирование, для которого выражение y > xдействует. Для пользовательских типов это означает, что оператор «больше» ( >) должен быть перегружен в типе.

Сокращенные шаблоны функций [ править ]

Начиная с C++20 , используя auto или Concept auto в любом из параметров объявления функции это объявление становится сокращенным объявлением шаблона функции . [3] Такое объявление объявляет шаблон функции, и к списку параметров шаблона добавляется один придуманный параметр шаблона для каждого заполнителя:

недействительный   f1  (  авто  );    // то же, что и template<class T> void f1(T) 
 void   f2  (  C1   auto  );    // то же, что и template<C1 T> void f2(T), если C1 — концепт 
 void   f3  (  C2   auto  ...);    // то же, что и template<C2... Ts> void f3(Ts...), если C2 — концепт 
 void   f4  (  C2   auto  ,   ...);    // то же, что и template<C2 T> void f4(T...), если C2 — концепт 
 void   f5  (  const   C3   auto  *  ,   C4   auto  &  );    // то же, что и template<C3 T, C4 U> void f5(const T*, U&); 

Шаблоны классов [ править ]

Шаблон класса предоставляет спецификацию для создания классов на основе параметров. Шаблоны классов обычно используются для реализации контейнеров . Шаблон класса создается путем передачи ему заданного набора типов в качестве аргументов шаблона. [4] Стандартная библиотека C++ содержит множество шаблонов классов, в частности контейнеры, адаптированные из стандартной библиотеки шаблонов , такие как vector.

Шаблоны переменных [ править ]

В C++14 шаблоны также можно использовать для переменных, как в следующем примере:

шаблон  <  имя типа   T  >  
 constexpr   T   pi   =   T  {  3.141592653589793238462643383L  };    // (Почти) из std::numbers::pi 

Нетиповые параметры шаблона [ править ]

Хотя шаблонизация типов, как в приведенных выше примерах, является наиболее распространенной формой шаблонизации в C++, шаблонизация значений также возможна. Так, например, класс, объявленный с помощью

шаблон   <  int   K  > 
 класс   MyClass  ; 

может быть создан с помощью определенного int.

В качестве примера из реальной жизни, стандартный фиксированного размера массива тип std::array шаблонизирован как по типу (представляющему тип объекта, который содержит массив), так и по числу, имеющему тип std::size_t (представляющее количество элементов, содержащихся в массиве). std::array можно объявить следующим образом:

шаблон  <  класс   T  ,   size_t   N  >   структур   массив  ; 

и массив из шести chars может быть объявлено:

массив  <  символ  ,   6  >   myArray  ; 

Специализация шаблона [ править ]

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

Явная специализация шаблона [ править ]

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

  • Если шаблон класса специализируется по подмножеству своих параметров, это называется частичной специализацией шаблона (шаблоны функций не могут быть частично специализированными).
  • Если все параметры специализированы, то это полная специализация .

Явная специализация используется, когда поведение функции или класса для конкретного выбора параметров шаблона должно отклоняться от общего поведения: то есть от кода, сгенерированного основным шаблоном или шаблонами. Например, определение шаблона ниже определяет конкретную реализацию max() для аргументов типа const char*:

#include   <cstring> 

 template  <>  
 const   char  *   max  (  const   char  *   a  ,   const   char  *   b  )   { 
     // Обычно результатом прямого сравнения 
     // двух строк C является неопределенное поведение; 
      // использование std::strcmp делает определение. 
      вернуть   std  ::  strcmp  (  a  ,   b  )   >   0   ?    а   :   б  ; 
  } 

Вариативные шаблоны [ править ]

В C++11 появились шаблоны с переменным числом аргументов , которые могут принимать переменное количество аргументов, что похоже на функции с переменным числом аргументов , такие как std::printf.

Псевдонимы шаблонов [ править ]

В C++11 представлены псевдонимы шаблонов, которые действуют как параметризованные определения типов .

Следующий код показывает определение псевдонима шаблона. StrMap. Это позволяет, например, StrMap<int> использоваться как сокращение для std::unordered_map<int,std::string>.

шаблон  <  имя_типа   T  >   с использованием   StrMap   =   std  ::  unordered_map  <  T  ,   std  ::  string  >  ; 

Общие функции программирования на других языках [ править ]

Первоначально концепция шаблонов не была включена в некоторые языки, например Java и C# 1.0. Использование дженериков в Java имитирует поведение шаблонов, но технически отличается. В C# добавлены дженерики (параметризованные типы) в .NET 2.0. Обобщенные шаблоны в Ada появились раньше шаблонов C++.

Хотя шаблоны C++, дженерики Java и дженерики .NET часто считаются похожими, дженерики лишь имитируют базовое поведение шаблонов C++. [5] Некоторые расширенные функции шаблонов, используемые такими библиотеками, как Boost и STLSoft , а также реализации STL для метапрограммирования шаблонов (явная или частичная специализация, аргументы шаблона по умолчанию, аргументы нетипового типа шаблона, аргументы шаблона шаблона и т. д.) недоступны. с дженериками.

В шаблонах C++ случаи во время компиляции исторически выполнялись путем сопоставления шаблонов с аргументами шаблона. Например, базовый класс шаблона в приведенном ниже примере факториала реализуется путем сопоставления 0, а не с помощью проверки неравенства, которая ранее была недоступна. Однако появление в C++11 функций стандартной библиотеки, таких как std::conditional, предоставило другой, более гибкий способ обработки создания экземпляров условного шаблона.

 индукции 

// Шаблон  <  unsigned   N  >  
 struct   Factorial   { 
   static   constexpr   unsigned   value   =   N   *   Factorial  <  N   -   1  >::  value  ; 
  }; 

  // Базовый случай через специализацию шаблона: 

 template  <>   struct   Factorial  <  0  >   { 
   static   constexpr   unsigned   value   =   1  ; 
  }; 

С помощью этих определений можно вычислить, скажем, 6! во время компиляции с использованием выражения Factorial<6>::value. Альтернативно, constexpr в С++11/ constevalв C++20 можно использовать для вычисления таких значений напрямую с помощью функции во время компиляции. По этой причине метапрограммирование шаблонов сейчас в основном используется для выполнения операций над типами.

См. также [ править ]

Ссылки [ править ]

  1. ^ Страуструп, Бьярне (8 сентября 2004 г.). «Язык программирования C++» . Stroustrup.com (личная домашняя страница) (3-е, специальное изд.).
  2. ^ Липпман, Стэн (11 августа 2004 г.). «Почему C++ поддерживает как класс, так и имя типа для параметров типа» . Сеть разработчиков Microsoft (MSDN) .
  3. ^ «P1141R1 — Еще один подход к ограниченным объявлениям» . Архивировано из оригинала 11 ноября 2018 г. Проверено 11 ноября 2018 г.
  4. ^ Вандевурде, Давид; Джосуттис, Николай (2002). Шаблоны C++: Полное руководство . Эддисон Уэсли . ISBN  978-0-201-73484-3 .
  5. ^ «Различия между шаблонами C++ и универсальными шаблонами C# (Руководство по программированию на C#)» . 12 марта 2024 г.

Внешние ссылки [ править ]

Arc.Ask3.Ru: конец оригинального документа.
Arc.Ask3.Ru
Номер скриншота №: D286CDE417ED8537F80A3520241FEE5A__1712341980
URL1:https://en.wikipedia.org/wiki/Template_(programming)
Заголовок, (Title) документа по адресу, URL1:
Template (C++) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть, любые претензии не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, денежную единицу можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)