Использовать 'class' или 'typename' для параметров шаблона? [Дубликат]

Возможный дубликат:
C ++ разница ключевых слов «typename» и «class» в шаблонах

Когда Определяя шаблон функции или шаблон класса в C ++, можно написать это:

template  ...

или можно написать это:

template  ...

Есть ли веская причина, чтобы предпочесть одно другому? ?


Я принял самый популярный (и интересный) ответ, но реальный ответ, похоже, звучит так: «Нет, нет веской причины предпочитать один другому».

  • Они эквивалентны (кроме как отмечено ниже).
  • У некоторых людей есть причины всегда использовать typename.
  • У некоторых людей есть причины всегда использовать class.
  • У некоторых людей есть причины использовать оба.
  • Некоторым людям все равно, какой из них они используют.

Заметим, однако, что до C ++ 17 в случае параметров шаблона шаблона , требовалось использовать class вместо typename. См. user1428839 ответ ниже. (Но этот конкретный случай не является вопросом предпочтения, это было требование языка.)

566
задан 17 revs, 7 users 85% 5 July 2019 в 15:37
поделиться

7 ответов

Stan Lippman говорил об этом здесь . Я думал, что это было интересно.

Сводка : Stroustrup первоначально использовал class для определения типов в шаблонах, чтобы не представлять новое ключевое слово. Некоторые в комитете волновались что эта перегрузка ключевого слова, ведомого к беспорядку. Позже, комитет представил новое ключевое слово typename для разрешения синтаксической неоднозначности и решил позволить ей также использоваться, чтобы определить, что шаблонные типы для сокращения беспорядка, но для обратной совместимости, class сохранили ее перегруженное значение.

387
ответ дан Farokh KH 5 July 2019 в 15:37
поделиться

По словам Scott Myers, Эффективный C++ (3-й редактор) объект 42 (который должен, конечно, быть окончательным ответом) - различие - "ничто".

Совет состоит в том, чтобы использовать "класс", если ожидается, что T всегда будет классом с "именем типа", если другие типы (интервал, символ* безотносительно) могут ожидаться. Считайте его подсказкой использования.

300
ответ дан DarenW 5 July 2019 в 15:37
поделиться

Я предпочитаю использовать имя типа, потому что я не поклонник перегруженных ключевых слов (здорово - сколько различных значений делает static, имеют для всевозможных контекстов?).

47
ответ дан Michael Burr 5 July 2019 в 15:37
поделиться

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

template <class IntegerType>
class smart_integer {
public: 
    typedef integer_traits<Integer> traits;
    IntegerType operator+=(IntegerType value){
        typedef typename traits::larger_integer_t larger_t;
        larger_t interm = larger_t(myValue) + larger_t(value); 
        if(interm > traits::max() || interm < traits::min())
            throw overflow();
        myValue = IntegerType(interm);
    }
}

larger_integer_t зависимое имя, таким образом, оно требует, чтобы 'имя типа' предшествовало ему так, чтобы синтаксический анализатор мог распознать, что larger_integer_t тип. класс , на otherhand, не имеет такого перегруженного значения.

, Что... или я просто ленив в глубине души. Я ввожу 'класс' намного чаще, чем 'имя типа', и таким образом нахожу намного легче ввести. Или это мог быть знак, что я пишу слишком много кода OO.

9
ответ дан Community 5 July 2019 в 15:37
поделиться

Это не имеет значения вообще, но класс делает, это быть похожим на T может только быть класс, в то время как это может, конечно, быть любой тип. Таким образом, имя типа более точно. С другой стороны, большинство людей использует класс, так, чтобы было, вероятно, легче читать обычно.

7
ответ дан Frederik Slijkerman 5 July 2019 в 15:37
поделиться

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

1
ответ дан Grant Limberg 5 July 2019 в 15:37
поделиться

Расширение комментария DarenW.

После того, как typename и class не будут восприниматься как сильно отличающиеся, может быть по-прежнему допустимы строгие требования к их использованию. Используйте class, только если это действительно класс, и typename, если это базовый тип, например char .

Эти типы действительно также принимаются вместо typename

template < char myc = '/'>

, который в этом случае даже превосходит typename или class.

Подумайте о «понятности» или понятности для других людей. И на самом деле учтите, что стороннее программное обеспечение / скрипты могут попытаться использовать код / ​​информацию, чтобы угадать, что происходит с шаблоном (рассмотрим swig).

-3
ответ дан 22 November 2019 в 22:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: