Учитывая вашу дополнительную информацию о шаблонах, мы теперь можем ответить.
Вариант использования - это когда вы хотите специализироваться на типе шаблона.Типичным примером является следующее:
template <typename T>
struct nonconst {
typedef T t;
};
template <typename T>
struct nonconst<T const> {
typedef T t;
};
Это эффективно позволяет вам удалить квалификатор const
из любого типа:
nonconst<int>::t x;
nonconst<int const>::t y;
assert(typeid(x) == typeid(int));
assert(typeid(y) == typeid(int));
Существует много похожихварианты использования, например, для добавления (или удаления) спецификатора указателя из типа, предоставления значений по умолчанию и специализаций для определенных типов и т. д.
Однако замечает другой регистр имен типов! Равные типы в typedef T T
являются недопустимыми в C ++. [Я исправлен: §7.1.3.2] Кроме того, стандарт фактического именования (подтвержденный его использованием в библиотеках Boost) заключается в вызове псевдонима имени типаtype
, например:
typedef T type;