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

88

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

кодировщик
источник

Ответы:

127

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

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

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

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

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

Не уверена
источник
+1. Иногда по какой-либо причине полезно различать «происхождение» класса, и в этом случае вы можете разумно использовать термин «шаблонный класс», но по указанным вами причинам рекомендуется тщательно определить, что вы подразумеваете под этим .
j_random_hacker
1
@j_random_hacker - см. литб ответ ниже, но вкратце, предпочтительный термин для этого - «специализация шаблона класса»
не уверен,
@ Not Sure: На самом деле я нахожу «специализацию шаблона класса» несколько двусмысленной, поскольку она также может относиться к процессу определения явной или частичной специализации для шаблона - чего-то, что не требуется для создания фактического «класса». :) IMHO "создание экземпляра шаблона класса" - самый ясный термин.
j_random_hacker
2
@j_random_hacker: для этого есть подходящий термин - «явная специализация шаблона класса» и «частичная явная специализация шаблона класса». Громоздко, но не двусмысленно :)
Not Sure
1
−1 Термины означают то, что они значат для людей, использующих эти термины. Бессмысленно начинать анализировать буквальные значения. Просто попробуйте это с любым другим термином из повседневной жизни или инженерии. Подводя итог, этот ответ - фигня. Ответ SHH , цитирующий Бьярна, в порядке.
Приветствия и hth. - Альф,
15

Бьярн Страуструп, создатель C ++, говорит в своей книге The C ++ Programming Language 4th edition , 23.2.1 Defining a Template:

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

SHH
источник
13

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

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

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

Нетерминальное -имя-шаблонный класс эквивалентно нетерминальным -шаблон идентификатор , используемый в сегодняшнем Standard и нисходит 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) не удовлетворяет.
Йоханнес Шауб - litb
источник
3
Хе-хе. Да, и несколько других тоже вносят свой вклад в этот набор. В частности, C ++ Faq lite и документация Qt. Автор faq lite сообщил мне в письме, что он хочет добавить еще один элемент часто задаваемых вопросов, поясняющий, что использование слова «специализация» лучше, поскольку оно вызывает меньше путаницы (использование «явной специализации» для вида специализации, написанной пользователем, тогда). Ребята из Qt сказали мне, что не хотят использовать термин «шаблон класса» ... они находят его слишком «неестественным». Очень плохо.
Йоханнес Шауб - лит
@ JohannesSchaub-litb: ARM был написан Бьярном Страуструпом и Маргарет Эллис, примерно в 1991 году, IIRC. Ваша цитата из ARM противоречит цитате SHH из 4-го издания TCPPL Бьярна . Так что хорошо, что вы проводите различие между старой (предстандартной) и современной терминологией.
Приветствия и hth. - Alf
1

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

ДЕБАЛИНА МАХАТА
источник
0

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

Ришаб
источник
0

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

Черный список96
источник
0

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

Последовательная терминология

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

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

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

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

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

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

  • 'шаблон-статическая-функция-член':
  • 'шаблон-член-функция':
  • 'шаблон-статический-член':
  • 'template-static-data-member ' template-member ': Альтернативные термины для определения члена, появляющегося отдельно от' шаблона-класса ', которому он принадлежит. Например :-
template<class T> int S<T>::sep_member()
{ return i; }
陳 力
источник
О Normalклассе, который вы описали выше: я не знал, что такой шаблон-член-функция был запрещен. Его принимают все компиляторы, которые я пробовал. Что мне не хватает?
dan_din_pantelimon