Страницы

Поиск по вопросам

воскресенье, 1 декабря 2019 г.

Какая разница в typename и class в параметрах шаблона?

#cpp #шаблоны_с++


Я не совсем понимаю разницу между:

template 


и

template 


Если она есть, то в чём заключается?
    


Ответы

Ответ 1



Стандарт C++ говорит следующее [п.14.1.2]: There is no semantic difference between class and typename in a template-parameter.

Ответ 2



В современном, т.е. C++17 варианте языка разницы между class и typename применительно к шаблонам нет. Однако, в более ранних стандартах разница была заметна при использовании шаблонных шаблонных (sic!) параметров, т.е. когда в качестве аргумента шаблона выступает шаблонный же тип. В этом случае использование typename перед именем шаблонного типа не являлось допустимым. Пример шаблонной функции f (нужно раскомментировать только одну строку): //template class C> // любой с++ //template class C> // любой с++ //template typename C> // начиная с c++17 //template typename C> // начиная с c++17 void f() { } В случае указания современному компилятору использовать более старую версию стандарта можем получить сообщение следующего вида: template template parameter using 'typename' is a C++17 extension [-Wc++17-extensions] Упомянутое ограничение возникало из-за следующего определения синтаксиса при использовании шаблонных шаблонных параметров до c++17 (в частности в с++11 п.14.1/1): template < template-parameter-list > class ...opt identifieropt template < template-parameter-list > class identifieropt = id-expression Здесь видно явное упоминание слова class. В c++17 (черновик N4687 п.17.1/1): template < template-parameter-list > type-parameter-key ...opt identifieropt template < template-parameter-list > type-parameter-key identifieropt = id-expression явный class заменили на type-parameter-key, который разворачивается следующим образом ниже по тексту: type-parameter-key : class typename Таким образом typename становится возможным использовать совместно с class.

Ответ 3



Таким образом можно создать удобство записи, чтения и восприятия. Например: template < class Cont > void show(const Cont& cont, std::ostream& out) {} Тут сразу бросается в глаза, что аргумент это контейнерный класс, и функция скорее всего выводит в out содержимое контейнера. Слово template в данном случаи для восприятия не так эффетивно. А вот: template > class stack{}; Тут легче понять, что Tp это тип элементов стека, а Sequence атрибут реализации (в данном случаи создается его адаптер).

Комментариев нет:

Отправить комментарий