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
?
Нет никакой разницы между вариантами 1 и 2. С таким же успехом можно было вынести использование typename
в шаблонных псевдонимах и в шаблонных переменных в отдельные "варианты"
template <typename T> using MyVector = std::vector<T, MyAllocator>;
template <typename T> constexpr T PI = 3.14159;
Все эти "варианты" - это один вариант. Во всех этих случаях typename
используется одинаково: для объявления типового параметра шаблона.
Начиная с 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
// ^^^^^
Виртуальный выделенный сервер (VDS) становится отличным выбором
Пишу серверное приложениеУ меня сервер написан на java а клиент android приложение