Search⌘ K

Understanding Partial Specialization

Explore the concept of partial specialization in C++ templates. Understand how to specialize class templates with selective template arguments, rules for defining partial specializations, and how the compiler selects the correct specialization. Learn practical applications including customizing behavior with std::array for different types.

In the previous lesson, we explored a variant of template specialization (explicit or full specialization). In this lesson, we’ll take a closer look at partial specialization, which is the second form of template specialization.

Partial specialization

Partial specialization occurs when we specialize a primary template but only specify some of the template arguments. This means a partial specialization has both a template parameter list (which follows the template keyword) and a template argument list (which follows the template name). However, only classes can be partially specialized.

Let’s explore the following example to understand how this works:

template<typename T, int S>
struct collection
{
void operator()()
{ std::cout << "primary template\n"; }
};
template<typename T>
struct collection<T, 10>
{
void operator()()
{ std::cout << "partial specialization <T, 10>\n"; }
};
template<int S>
struct collection<int, S>
{
void operator()()
{ std::cout << "partial specialization <int, S>\n"; }
};
template<typename T, int S>
struct collection<T*, S>
{
void operator()()
{ std::cout << "partial specialization <T*, S>\n"; }
};
Partial specialization of class templates

We have a primary template called collection that has two template arguments (a type template argument and a non-type template argument), and we have three partial specializations, as follows:

  • A specialization for the non-type template argument S with the value 10

  • A specialization for the int type

  • A specialization for the pointer type T* ...