В чем разница между классом шаблона и шаблоном класса? - PullRequest
77 голосов
/ 19 мая 2009

В чем разница между классом шаблона и шаблоном класса?

Ответы [ 8 ]

112 голосов
/ 19 мая 2009

Это распространенная путаница для многих (включая страницу «Общее программирование» в Википедии, некоторые учебные пособия по C ++ и другие ответы на этой странице). Что касается C ++, не существует такого понятия, как «шаблон класса», есть только «шаблон класса». Способ прочитать эту фразу - «шаблон для класса», так как в отличие от «шаблона функции», который является «шаблоном для функции». Опять же: классы не определяют шаблоны, шаблоны определяют классы (и функции). Например, это шаблон , в частности шаблон класса , но это не класс :

template<typename T> class MyClassTemplate
{ 
    ...
};

Объявление MyClassTemplate<int> - это класс или педантично, класс, основанный на шаблоне. Не существует специальных свойств класса, основанного на шаблоне, по сравнению с классом, не основанным на шаблоне. Специальные свойства самого шаблона .

Фраза «шаблонный класс» ничего не значит, потому что слово «шаблон» не имеет значения в качестве прилагательного применительно к существительному «классу» в том, что касается C ++. Это подразумевает существование класса , который является (или определяет) шаблоном , который не является понятием, существующим в C ++.

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

11 голосов
/ 19 мая 2009

Разница в том, что термин "шаблонный класс" просто не существует в стандарте C ++. Этот термин используется в основном людьми, которые думают, что термин «шаблон класса» сбивает с толку (например, компании Qt Nokia и ранее Trolltech).

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

Класс, сгенерированный из шаблона класса, называется классом шаблона, так же как и класс, специально определенный с template-class-name в качестве имени

Нетерминальное template-class-name эквивалентно нетерминальному template-id , используемому в сегодняшнем Стандарте, и сводится к template-name < arguments >.


Ознакомить вас с сегодняшними терминами, что важнее, чем использование сомнительных старых терминов

// (1) defines a class template
template<typename T> class A { }; 

// (2) defines a class template explicit specialization 
template<> class A<int> { };

// (3) defines a class template partial specialization
template<typename T> class A<T*> { };

// (4) explicitly instantiates A<char>. 
template class A<char>;

// (5) implicitly instantiates A<short> (because of the member declaration)
struct D { A<short> a; };
  • ARM вызывает класс (2), а классы, генерируемые с помощью (4) и (5) шаблонного класса . Я не уверен, знал ли ARM о частичных специализациях. Но если это так, (3) не был назван классом шаблона, потому что (3) не определяет класс, но определяет шаблон.
  • Текущий стандарт вызывает класс (2), а те, которые генерируются (4) и (5) специализации шаблонов классов . И (3) называется частичной специализацией , в отличие от явной специализации . Иногда он также вызывает (3) специализацию (3.2 / 5 - однако с уточняющими перекрестными ссылками), хотя я нахожу, что это не совсем понятно для меня, поскольку определяет «специализацию» как «класс, функцию или класс». член ", который (3) не удовлетворяет.
8 голосов
/ 25 сентября 2016

Бьярн Страуструп, создатель C ++, говорит в своей книге Язык программирования C ++, 4-е издание , 23.2.1 Определение шаблона:

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

7 голосов
/ 19 мая 2009

Класс шаблона связан с шаблоном разработки Метода шаблона , в то время как шаблон класса является просто шаблоном класса «заполняются».

1 голос
/ 08 мая 2018

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

0 голосов
/ 05 июня 2018

Взгляните на этот документ (из wg21, опубликованный в 1992 году) :

Согласованная терминология

Большая часть аргументов и разногласий на сегодняшний день связана с терминологией, использованной в главе, описывающей шаблоны. Наиболее часто встречалось применение 'function-template' и 'template-function' для выражения различных идей и намерений. Поскольку согласованное именование не применяется, результатом является путаница и спор.

Для целей настоящего документа, в качестве предложения для официального принятия комитетом при обсуждении шаблонов, а также для уточнения документации; Я предлагаю принять формализацию, чтобы конечный '-template' описывал набор типов или функций, описанных шаблоном. И что ведущий 'шаблон -' , используется для описания определения шаблона части '- шаблона' , такого как 'template-member-function'. Таким образом: -

  • 'function-template': Набор функций, описываемых шаблоном, параметрический для некоторой информации о типе, предоставляемой в качестве аргумента для этого шаблона. Например: -
template<class T> int nullcheck( T* pT )
{ return ( pT != 0 ); }
  • 'class-template': Набор классов, описываемых шаблоном, параметрический для некоторой информации о типе, предоставляемой в качестве аргумента для этого шаблона. За Пример: -
template<class T> class S {
int i;
public:
int sep_member();
int imm_member()
{ return 2; }
}
  • 'template-function': Этот термин больше не разрешен. **
  • 'template-class': Этот термин недопустим. **

  • 'member-function-template': Этот термин недопустим, поскольку он описывает свойство, которое в настоящее время не поддерживается определением шаблона. С использованием выше терминологического соглашения, это будет описывать член не-класса-шаблона, чье определение само по себе шаблон. Например: -

class Normal { public:
template<class T> int foo(T*pT)
{ return ( pT == 0 ); }
};

Однако, поскольку шаблоны в настоящее время ограничены глобальным область действия, такой шаблон недействителен.

  • шаблон статическая-член-функция ':
  • 'шаблон-член-функция':
  • 'шаблона статический-член':
  • 'шаблон-статическому данных членов 'шаблон-член': Альтернативные термины для определения члена, появляющегося отделить от «шаблона класса», к которому он принадлежит. За пример: -
template<class T> int S<T>::sep_member()
{ return i; }
0 голосов
/ 17 июня 2016

Шаблон класса - это универсальный класс для различных типов объектов. В основном это обеспечивает спецификацию для генерации классов на основе параметров. Каждый раз, когда создается новый объект, для этой цели в памяти будет находиться новый класс. Это называется создание шаблона класса, а каждая созданная версия класса называется шаблоном класса.

0 голосов
/ 23 ноября 2015

Шаблонный класс: класс, имеющий общее определение, или класс с параметрами, который не создается, пока информация не будет предоставлена ​​клиентом. Это относится к жаргону для простых шаблонов. Просто класс с префиксом шаблона и использованием T. Шаблон класса. Индивидуальная конструкция класса определяется шаблоном класса, который почти аналогичен способу создания отдельных объектов с использованием класса. Он ссылается на объект шаблона класса Ex- имя класса имя объекта (список аргументов)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...