Какая особенность C ++ позволяет шаблонным классам ссылаться на себя без аргументов шаблона? - PullRequest
6 голосов
/ 07 ноября 2011

Дано:

template <typename T>
class C {
    C & operator ++ () { ... }
};

Почему / как C разрешено объявлять переменные и функции типа C вместо того, чтобы называть C<T>? Я действительно не задумывался об этом, прежде чем работать над шаблоном с множеством параметров, из-за которых было бы неудобно описывать «тип личности».

Есть ли какие-то причуды, о которых я должен знать?

Ответы [ 3 ]

6 голосов
/ 07 ноября 2011

[n3290: 14.6.1/1]: Как обычные (не шаблонные) классы, класс шаблоны имеют имя введенного класса (пункт 9) . имя_инъектированного класса можно использовать как имя-шаблона или имя-типа . Когда он используется с template-arguments-list , как шаблон-аргумент для шаблона шаблон-параметр или в качестве окончательного идентификатора в подробный спецификатор типа класса друга Объявление шаблона, оно относится к самому шаблону класса. В противном случае это эквивалентно имени шаблона , за которым следует шаблон-параметров шаблона класса, заключенного в <>.

Якобы, это просто удобная функция.

2 голосов
/ 07 ноября 2011

Почему / как C может объявлять переменные и функции типа C вместо того, чтобы указывать имя C?

Это просто указано так.Имя шаблона вставляется в его тело и означает фактический тип (с аргументами).

Есть ли какие-то причуды, о которых я должен знать?

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

template <class T>
class A : public Base<A<T> > // not Base<A>
2 голосов
/ 07 ноября 2011

Это просто синтаксический сахар.

Удобно не менять сигнатуры ваших методов, если вам нужно изменить параметры шаблона.

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