Шаблоны классов и класс шаблонов - PullRequest
3 голосов
/ 06 июня 2010

Есть ли разница между шаблоном класса и шаблоном класса. Если так, что это?

Ответы [ 7 ]

10 голосов
/ 06 июня 2010

Когда используются оба термина, есть очень тонкая разница. Оно более лингвистическое, чем семантическое, зависит от того, какое слово вы модифицируете.

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

template <typename T> class SomeClass {...};      // this is a class template
template <typename T> int some_function(T&) {...} // this is a function template

A шаблон класса - это особый вид класса. Существует много видов классов, и, в частности, классы шаблонов - это классы, определенные с использованием шаблона класса. Контрастность:

SomeClass sc;         // SomeClass is an ordinary (non-template) class
SomeClass<int> sc;    // SomeClass<int> is a template class

Из Глоссарий Страуструпа C ++ :

шаблон класса - класс, параметризованный типами, значениями или шаблонами. аргументы шаблона, необходимые для идентификации класса, который будет сгенерирован для Шаблон класса должен быть указан там, где используется класс шаблона. За пример "vector<int> v;" генерирует вектор целых из вектора шаблон. Смотрите также шаблон. TC ++ PL 13.2, D & E 15.3.

Оба выражения используются в книге Страуструпа «Язык программирования C ++» и в стандарте ISO / IEC C ++ до 1998 года.

Примечание: Как обсуждалось в комментариях ниже, кажется, что C ++ 03 больше не использует термин «шаблонный класс» (хотя у меня нет его копии), предположительно чтобы уменьшить путаницу. Как я уже говорил ранее, это в основном одно и то же, это просто лингвистическое различие: в контексте шаблонов вы ссылаетесь на определенный тип шаблона или в контексте классов вы ссылаетесь на определенный тип класса. Если вы просто придерживаетесь «шаблона класса», вы ничего не потеряете.

Больше пищи для размышлений:

3 голосов
/ 06 июня 2010

Этот вопрос также специально рассматривается в окончательной книге по шаблонам C ++ ( "Шаблоны C ++: Полное руководство", Вандворде и Йосуттис ), раздел 7.1, стр.87 (по крайней мере, в моем издании ):

7.1 «Шаблон класса» или «Шаблон класса»?

[надрез]

Существует некоторая путаница в том, как Класс, который является шаблоном, называется:

Термин шаблон класса гласит, что класс это шаблон. То есть это это параметризованное описание семейство классов.

Термин шаблон класса с другой была использована рука

  • как синоним шаблона класса.

  • для ссылки на классы, сгенерированные из шаблонов.

  • для ссылки на классы с именем, являющимся идентификатором шаблона.

Разница между вторым и третье значение несколько тонкое и неважно для оставшейся части текст.

Из-за этой неточности мы избегаем термин шаблон класса в этой книге.

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

(Любой, я имею в виду любой , работающий с шаблонами C ++, должен иметь копию этой книги, кстати.)

1 голос
/ 06 июня 2010

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

class templateClass:
  public:
    virtual hotSpotA: nil
    virtual hotSpotB: nil
    method templateExecute:
      do some stuff
      hotSpotA
      do some other stuff
      hotSpotB
      do even more stuff

Затем вы будете использовать этот шаблонный класс, унаследовав его и реализовав hotSpots:

class templateClient from templateClass:
  public:
    override hotSpotA:
      client-specific stuff A
    override hotSpotB:
      client-specific stuff B

client = new templateClient
client.templateExecute

Многие мета-шаблоны проектирования опирались на такую ​​структуру (и, действительно, если вы посмотрите на большинство шаблонов проектирования ОО, вы увидите такую ​​структуру в различных формах, используемых постоянно).

В настоящее время вы больше не увидите, чтобы эта терминология использовалась таким образом из-за пагубного влияния C ++. Я не уверен, каков текущий термин для этой структуры мета-паттерна, потому что я почти полностью отказался от ООП, за исключением случаев, когда он вынужден использовать его.

Была книга, которая объяснила это (и другие мета-шаблоны) очень подробно, если вы захотите прочитать: Шаблоны проектирования для объектно-ориентированной разработки программного обеспечения

1 голос
/ 06 июня 2010

Я считаю class template своего рода шаблоном, а template class - классом, созданным из class template.

1 голос
/ 06 июня 2010

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

1 голос
/ 06 июня 2010

Нет, два термина относятся к одному и тому же. В обоих случаях это класс, определенный как:

template<typename T> class Foo {};

Это в отличие от обычного класса, который просто объявлен как:

class Foo {};

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

Foo<char> x;
0 голосов
/ 04 августа 2010
 What is the difference between a template class and a class template?
 What is the difference between a template function and a function template?

Вопрос: что модифицируется? Вообще говоря, если мы говорим, что-то является «зеленым домом», то объект - это дом, который оказывается зеленым. Имея это в виду, это явно класс:

struct SomeClass {
   int i;
   };

тогда как это явно шаблон:

 template <typename T>
 struct cTemplate {
 int member;
 };

Что это за шаблон? c Образец шаблона класса. В том же духе, это функция:

void foo() {}

и это шаблон:

template <typename T>
T fTemplate(T arg)
{
 return arg * arg;
}

Что это за шаблон? fTemplate - это шаблон функции.

Теперь SomeClass является именем класса и, следовательно, позволяет нам писать что-то вроде:

SomeClass sc;

По этим же принципам мы знаем, что можем сделать что-то вроде:

cTemplate<int> cti;

Другими словами, cTemplate также является именем класса. Итак, cTemplate - это класс. Подумайте об этом, это будет эффективно, когда будет создан экземпляр:

template <> struct cTemplate<int> {
  int member;
}

Что это за класс? Что ж, вероятно, нет необходимости уточнять, какого рода, но если это так, то может показаться, что cTemplate является классом шаблона. Аналогично с функциями. То есть, если бы вы вызывали fTemplate, например:

fTemplate(99.99);

затем следует, что создается экземпляр функции:

fTemplate<double>(double)

В частности, это:

template <>
double fTemplate<double>(double)
{
  return arg * arg;
}

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

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

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