A specialization can give one type its own implementation while other types use the general template.

specialization A specialized template version is selected for a specific type, such as `bool`, while the primary template handles the rest.

Template Specialization

example
template_specialization.cpp
Replay: real traced execution (multi-file project)
#include <iostream>
#include <string>

template <typename T>
std::string describe(T value) {
    return "value=" + std::to_string(value);
}

template <>
std::string describe<bool>(bool value) {
    if (value) {
        return "flag=yes";
    }
    return "flag=no";
}

int main() {
    int score = 7;
    bool active = true;

    std::cout << describe(score) << std::endl;
    std::cout << describe(active) << std::endl;
    return 0;
}
#include <iostream>
#include <string>

template <typename T>
std::string describe(T value) {
    return "value=" + std::to_string(value);
}

template <>
std::string describe<bool>(bool value) {
    if (value) {
        return "flag=yes";
    }
    return "flag=no";
}

int main() {
    int score = 2;
    bool active = true;

    std::cout << describe(score) << std::endl;
    std::cout << describe(active) << std::endl;
    return 0;
}
#include <iostream>
#include <string>

template <typename T>
std::string describe(T value) {
    return "value=" + std::to_string(value);
}

template <>
std::string describe<bool>(bool value) {
    if (value) {
        return "flag=yes";
    }
    return "flag=no";
}

int main() {
    int score = 10;
    bool active = true;

    std::cout << describe(score) << std::endl;
    std::cout << describe(active) << std::endl;
    return 0;
}
#include <iostream>
#include <string>

template <typename T>
std::string describe(T value) {
    return "value=" + std::to_string(value);
}

template <>
std::string describe<bool>(bool value) {
    if (value) {
        return "flag=yes";
    }
    return "flag=no";
}

int main() {
    int score = 7;
    bool active = false;

    std::cout << describe(score) << std::endl;
    std::cout << describe(active) << std::endl;
    return 0;
}
  1. score ← 7, active ← 1

    17int main() {18    int score→ 7 = 7; //@score=2, 1019    bool active→ 1 = true; //@active=false2021    std::cout << describe(score7) << std::endl;22    std::cout << describe(active1) << std::endl;23    return 0;
    outputvalue=7
  2. template <> std::string describe<bool>(bool value)

    9template <>10std::string describe<bool>(bool value1) {11    if (value) {
  3. if (value)

    10std::string describe<bool>(bool value) {11    if (value1) {12        return "flag=yes";13    }
  4. std::cout << describe(active) << std::endl;

    21    std::cout << describe(score) << std::endl;22    std::cout << describe(active1) << std::endl;23    return 0;24}
    outputflag=yes
  1. score ← 2, active ← 1

    17int main() {18    int score→ 2 = 2;19    bool active→ 1 = true;2021    std::cout << describe(score2) << std::endl;22    std::cout << describe(active1) << std::endl;23    return 0;
    outputvalue=2
  2. template <> std::string describe<bool>(bool value)

    9template <>10std::string describe<bool>(bool value1) {11    if (value) {
  3. if (value)

    10std::string describe<bool>(bool value) {11    if (value1) {12        return "flag=yes";13    }
  4. std::cout << describe(active) << std::endl;

    21    std::cout << describe(score) << std::endl;22    std::cout << describe(active1) << std::endl;23    return 0;24}
    outputflag=yes
  1. score ← 10, active ← 1

    17int main() {18    int score→ 10 = 10;19    bool active→ 1 = true;2021    std::cout << describe(score10) << std::endl;22    std::cout << describe(active1) << std::endl;23    return 0;
    outputvalue=10
  2. template <> std::string describe<bool>(bool value)

    9template <>10std::string describe<bool>(bool value1) {11    if (value) {
  3. if (value)

    10std::string describe<bool>(bool value) {11    if (value1) {12        return "flag=yes";13    }
  4. std::cout << describe(active) << std::endl;

    21    std::cout << describe(score) << std::endl;22    std::cout << describe(active1) << std::endl;23    return 0;24}
    outputflag=yes
  1. score ← 7, active ← 0

    17int main() {18    int score→ 7 = 7;19    bool active→ 0 = false;2021    std::cout << describe(score7) << std::endl;22    std::cout << describe(active0) << std::endl;23    return 0;
    outputvalue=7
  2. template <> std::string describe<bool>(bool value)

    9template <>10std::string describe<bool>(bool value0) {11    if (value) {12        return "flag=yes";13    }14    return "flag=no";15}
  3. std::cout << describe(active) << std::endl;

    21    std::cout << describe(score) << std::endl;22    std::cout << describe(active0) << std::endl;23    return 0;24}
    outputflag=no