variable_template — 변수 템플릿

variable_template — 변수 템플릿 (Variable template)

**변수 템플릿(variable template)**은 변수 또는 정적 데이터 멤버의 집합(family)을 정의하는 템플릿이에요. C++14에서 도입됐어요.

타입 매개변수에 따라 값이 달라지는 상수·변수를 정의할 때 사용해요.

출처: cppreference

본문

문법 (Syntax)

template< parameter-list > variable-declaration                                    // (1)
template< parameter-list > requires constraint variable-declaration                // (2)
  • variable-declaration — 변수의 선언. 선언된 변수 이름이 템플릿 이름이 돼요.
  • parameter-list — 비어 있지 않은, 쉼표로 구분된 템플릿 매개변수 목록
// 타입마다 다른 값을 갖는 변수 템플릿
template<typename T>
constexpr T pi = static_cast<T>(3.1415926535897932385);

pi<float>;    // 3.14159...f
pi<double>;   // 3.14159...
pi<int>;      // 3 (int로 캐스팅)

변수 템플릿은 constexpr과 함께 컴파일 타임 값을 타입별로 정의하는 데 특히 유용해요.

// 타입이 특정 성질을 갖는지의 변수 템플릿
template<typename T>
constexpr bool is_pointer = false;
template<typename T>
constexpr bool is_pointer<T*> = true;   // 부분 특수화

is_pointer<int>;    // false
is_pointer<int*>;   // true

클래스의 정적 데이터 멤버도 템플릿화할 수 있어요.

template<typename T>
struct S {
    static int count;   // 정적 멤버
};
template<typename T>
int S<T>::count = 0;    // 정의

변수 템플릿의 특징:

  • template<> 완전 특수화와 부분 특수화를 지원해요.
  • constexpr 변수 템플릿은 컴파일 타임 메타프로그래밍에 널리 쓰여요.
  • 표준 라이브러리에도 std::is_same_v, std::true_type 같은 변수 템플릿이 있어요 (접미사 _v).
// 표준 타입 특질의 변수 템플릿 형태
static_assert(std::is_integral_v<int>);   // 통합 변수 템플릿

변수 템플릿은 타입에 따라 다르게 정의되는 상수·성질·컴파일 타임 값을 표현하는 간결하고 강력한 도구예요.

더 알아보기 (Learn more)

cppreference