HLFX.Ru Forum
профиль •  правила •  регистрация •  календарь •  народ •  FAQ •  поиск •  новое •  сутки •  главная •  выход  
HLFX.Ru Forum HLFX.Ru Forum > Наш форум > Технические вопросы > Почему С++ поддерживает два ключевых слова
template<class T> и template<typename T>
  Предыдущая тема   Следующая тема
Автор
Тема Новая тема    Ответить
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 34523
Нанёс повреждений: 514 ед.
Возраст: 37

Рейтинг



Награды
 
[1 награда]


Почему С++ поддерживает два ключевых слова

Почему С++ поддерживает два ключевых слова – class и typename как параметры типов

Недавно меня спросили, почему у нас поддерживаются и class, и typename в С++ для обозначения параметров типов, ведь они не несут никакой значимости для платформы – например, class может подразумевать нативный тип, а typename – тип CLI. Оба они используются для параметризации в шаблонах и заменяются на заданный пользователем тип.
Почему два ключевых слова? Потому что так исторически сложилось. В первоначальной спецификации шаблонов Страуструп повторно использовал имеющееся ключевое слово class для задания параметра типа, вместо того чтобы вводить новое ключевое слово, что могло бы испортить имеющиеся программы. Не то чтобы не хотелось ввести новое ключевое слово – просто не хотелось потенциально привнести ошибки. И вплоть до стандарта ISO-C++ это был единственный способ объявить параметр типа.
Повторное использование имеющегося ключевого слова всегда сеет неразбериху. Мы увидели, что начинающие программисты ограничиваются использованием классов в качестве параметров типов, но не встроенных типов или указателей. Так что, похоже, то что мы не ввели новое ключевое слово, было ошибкой.
Во время стандартизации мы обнаружили, что некоторые конструкции трактуются как выражения, в то время как предполагалось, что это объявления. Например:

C++ Source Code:
1
template <class T>
2
class Demonstration
3
{
4
public:
5
  void method()
6
  {
7
    T::A *aObj; // oops...
8
    //...
9
  };

В то время как программист предполагает, что конструкция, содержащая aObj, является объявлением указателя на вложенный тип А в типовом параметре Т, грамматика языка интерпретирует это как арифметическое выражение: умножение статического члена А типа Т на aObj и отбрасывание результата. Ну что за хрень! (Такое затруднительное положение невозможно для общих типов – нет способа убедиться, что любой Т содержит А, так что рантайм может безопасно построить экземпляр общего типа.)
Комиссия решила, что новое ключевое слово – это как раз то, что нужно, чтобы обойти навязчивую идею компилятора по поводу выражений. Это слово говорит само за себя – typename. Когда оно входит в конструкцию такого типа:
C++ Source Code:
typename T::A* a6; // declare pointer to T’s A

оно сообщает компилятору трактовать последующую информацию как объявление. Ну раз уж ввели новое ключевое слово, черт возьми, так почему бы не исправить путаницу, вызванную использованием class в шаблонах? Конечно же, учитывая большое количество написанного кода, книг, статей, разговоров и постов с использованием слова class, они решили оставить и его поддержку. Вот почему их два.

Оригинал статьи на английском

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

__________________

Сообщить модератору | | IP: Записан
Сообщение: 13102

Старое сообщение 12-05-2007 16:12
-
Government-Man
Призрак

Дата регистрации: Apr 2006
Проживает: N/A
Сообщений: 3507

Рейтинг



Награды
 
[1 награда]


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

Сообщить модератору | | IP: Записан
Сообщение: 13103

Старое сообщение 12-05-2007 18:23
- За что?
zimer
хо-хоу!

Группа: Опытный
Дата регистрации: Oct 2005
Проживает: СПБ
Сообщений: 1308
Возраст: 39

Рейтинг



Награды
 
[1 награда]


нда. интересненько.

__________________
Рассыпалась соль - к ссоре.
Рассыпался сахар - к миру.
Рассыпался кокаин - к феерическим ощущениям и фантасмагорическим видениям.
Ласточки низко летают - будет дождь.
Коровы низко летают - рассыпался кокаин.

Сообщить модератору | | IP: Записан
Сообщение: 13107

Старое сообщение 13-05-2007 06:54
- За что?
Тема: (Опционально)
Ваш ответ:



Переводчик транслита


[проверить длину сообщения]
Опции: Автоматическое формирование ссылок: автоматически добавлять [url] и [/url] вокруг интернет адресов.
Уведомление по E-Mail: отправить вам уведомление, если кто-то ответил в тему (только для зарегистрированных пользователей).
Отключить смайлики в сообщении: не преобразовывать текстовые смайлики в картинки.
Показать подпись: добавить вашу подпись в конец сообщения (только зарегистрированные пользователи могут иметь подписи).

Временная зона GMT. Текущее время 23:10. Новая тема    Ответить
  Предыдущая тема   Следующая тема
HLFX.Ru Forum HLFX.Ru Forum > Наш форум > Технические вопросы > Почему С++ поддерживает два ключевых слова
template<class T> и template<typename T>
Версия для печати | Отправить тему по E-Mail | Подписаться на эту тему

Быстрый переход:
Оцените эту тему:

Правила Форума:
Вы not можете создавать новые темы
Вы not можете отвечать в темы
Вы not можете прикреплять вложения
Вы not можете редактировать ваши сообщения
HTML Код ВЫКЛ
vB Код ВКЛ
Смайлики ВКЛ
[IMG] Код ВКЛ
 

< Обратная связь - HLFX.ru >

На основе vBulletin
Авторское право © 2000 - 2002, Jelsoft Enterprises Limited.
Дизайн и программирование: Crystice Softworks © 2005 - 2024