Skip to main content
A variable template (introduced in C++14) is a declaration that defines a family of variables or static data members parameterized by one or more template arguments. It extends the C++ template mechanism—previously restricted to classes, functions, and type aliases—directly to variable declarations, allowing the compiler to generate distinct, type-safe variables from a single parameterized definition.

Syntax

The base syntax for declaring a variable template at namespace or class scope requires the template keyword followed by the template parameter list, the variable type, its identifier, and an optional initializer.

Instantiation and Memory Semantics

When a variable template is instantiated with a specific set of template arguments, the compiler generates a unique variable. Each instantiation occupies its own distinct memory address.

Specialization

Variable templates support both explicit (full) specialization and partial specialization, utilizing the same resolution rules as class templates.

Explicit Specialization

You can define a completely different type and initializer for a specific template argument.

Partial Specialization

You can specialize the variable template for a subset of types, such as pointers or arrays.

Scope and Linkage

Variable templates can be declared at namespace scope or as static data members within a class. They cannot be declared at block scope (inside a function). Namespace Scope:
Class Scope (Static Data Members): A non-templated class can contain a templated static data member.

Type Deduction and Constraints

Variable templates do not support template argument deduction from the initializer; the template arguments must always be explicitly specified (e.g., var<int>, not var). However, starting in C++20, variable templates can be constrained using Concepts to restrict the types that can be used for instantiation.

Type Traits Equivalence

Variable templates are the underlying mechanism for the _v suffix conventions found in the <type_traits> library. They act as syntactic sugar over accessing the ::value static member of a class template.
Tired of Poor C++ Skills? Fix That With Deep Grasping!Learn More