Templates
Template Specialization
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
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;
}
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=7template <> std::string describe<bool>(bool value)
9template <>10std::string describe<bool>(bool value1) {11 if (value) {if (value)
10std::string describe<bool>(bool value) {11 if (value1) {12 return "flag=yes";13 }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
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=2template <> std::string describe<bool>(bool value)
9template <>10std::string describe<bool>(bool value1) {11 if (value) {if (value)
10std::string describe<bool>(bool value) {11 if (value1) {12 return "flag=yes";13 }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
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=10template <> std::string describe<bool>(bool value)
9template <>10std::string describe<bool>(bool value1) {11 if (value) {if (value)
10std::string describe<bool>(bool value) {11 if (value1) {12 return "flag=yes";13 }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
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=7template <> 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}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