Использование ключевого слова typename

119
28 октября 2019, 14:30

1) Шаблонная функция:

template<typename T>
T add(T a, T b)
{
    return a + b;
}

2) Шаблонний клас:

template<typename T>
struct Base
{
    T data;
    int arr[10];
};

3) Если тип зависит от параметра шаблона:

template<typename T>
void for_each(std::vector<T> &vec)
{
    for(typename std::vector<T>::iterator it = vec.begin(); it!=vec.end(); it++)
    *it = *it + *it; 
}

Какие есть еще случаи использования typename ?

Answer 1

Нет никакой разницы между вариантами 1 и 2. С таким же успехом можно было вынести использование typename в шаблонных псевдонимах и в шаблонных переменных в отдельные "варианты"

template <typename T> using MyVector = std::vector<T, MyAllocator>;
template <typename T> constexpr T PI = 3.14159;

Все эти "варианты" - это один вариант. Во всех этих случаях typename используется одинаково: для объявления типового параметра шаблона.

  1. Начиная с C++17 ключевое слово typename может использоваться вместо ключевого слова class в объявлениях шаблонных параметров шаблонов

    template <typename T, template <typename, typename> typename CONT>
    //                                                  ^^^^^^^^ 
    class MyClass
    {
      CONT<T, std::allocator<T>> container;
    };
    

    До C++17 второй параметр этого шаблона должен был бы объявляться как

    template <typename, typename> class CONT
    //                            ^^^^^ 
    
READ ALSO
Инициализация класса массивом

Инициализация класса массивом

у меня есть следующий класс со следующим конструктором:

117
Socket Android Java

Socket Android Java

Пишу серверное приложениеУ меня сервер написан на java а клиент android приложение

126
Сумирование значений в postgresql

Сумирование значений в postgresql

Хочу просумировать значения в JPA таким образом:

129