Кратко:

Шаблоны переменных позволяют определять переменные, значение которых зависит от типа параметра шаблона. Они могут быть использованы для определения обобщенных констант, которые автоматически адаптируются к конкретному типу.

Основные свойства:

  • Обобщенность: позволяют создавать переменные, значение которых зависит от типа параметра.
  • Гибкость: могут использоваться для определения констант или других значений для различных типов.
  • Компактность: уменьшают количество дублирующегося кода, делая его более чистым и читаемым.

Определение шаблона переменной

#include <iostream>
#include <type_traits>
 
// Шаблон переменной
template<typename T>
constexpr T pi = T(3.1415926535897932385L);
 
// Специализация шаблона переменной для int
template<>
constexpr int pi<int> = 3;

Пример кода

Использование шаблона переменной

int main() {
    std::cout << "pi<double>: " << pi<double> << std::endl; // Вывод: 3.14159...
    std::cout << "pi<float>: " << pi<float> << std::endl;   // Вывод: 3.14159...
    std::cout << "pi<int>: " << pi<int> << std::endl;       // Вывод: 3
 
    return 0;
}

Шаблон переменной для определения свойства типа

#include <iostream>
#include <type_traits>
 
// Шаблон переменной для проверки, является ли тип указателем
template<typename T>
constexpr bool is_pointer_v = std::is_pointer<T>::value;
 
int main() {
    std::cout << std::boolalpha;
    std::cout << "is_pointer_v<int>: " << is_pointer_v<int> << std::endl;       // Вывод: false
    std::cout << "is_pointer_v<int*>: " << is_pointer_v<int*> << std::endl;     // Вывод: true
    std::cout << "is_pointer_v<double*>: " << is_pointer_v<double*> << std::endl; // Вывод: true
 
    return 0;
}

Применение шаблонов переменных

Шаблоны переменных могут быть полезны в различных ситуациях, например, для определения констант, зависящих от типа, или для создания метапрограмм, которые работают с типами.