Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lernen Partielle Vorlagenspezialisierung | Templatespezialisierung
C++-Vorlagen

book
Partielle Vorlagenspezialisierung

Die Spezialisierung von Templates für ein einzelnes Parameter-Template ist unkompliziert, wird jedoch bei mehreren Parametern komplexer. Hier kommt die partielle Templatespezialisierung ins Spiel. Sie ermöglicht es Ihnen, eine spezialisierte Version eines Templates für spezifische Teilmengen von Typen oder Werten zu erstellen.

cpp

main

copy
// What if `T1` and `T2` are the same type?
// Or what if you want to define special behavior when `T1` is a `std::string`?

template<typename T1, typename T2>
void TemplateExample(T1 first, T2 second)
{
std::cout << "Generic template!" << std::endl;
}
12345678
// What if `T1` and `T2` are the same type? // Or what if you want to define special behavior when `T1` is a `std::string`? template<typename T1, typename T2> void TemplateExample(T1 first, T2 second) { std::cout << "Generic template!" << std::endl; }

Syntax der partiellen Templatespezialisierung

Sie können die partielle Templatespezialisierung als eine Form der Template-Überladung betrachten. Hier sind die zu befolgenden Regeln:

Bei der partiellen Spezialisierung definieren Sie eine neue Version einer Template-Funktion, bei der einige ihrer Parameter auf bestimmte Typen festgelegt sind, während andere generisch bleiben. Der Compiler verwendet diese spezialisierte Version, wann immer er während der Template-Instanziierung auf passende Typen trifft.

cpp

main

copy
#include <iostream>

// Primary template
template<typename T1, typename T2>
bool IsSameType(T1 first, T2 second) { return false; }

// Partial specialization for when both types are the same
template<typename T>
bool IsSameType(T first, T second) { return true; }

int main()
{
std::cout << IsSameType(10, 'a') << std::endl;
std::cout << IsSameType("Hello", "World") << std::endl;
}
123456789101112131415
#include <iostream> // Primary template template<typename T1, typename T2> bool IsSameType(T1 first, T2 second) { return false; } // Partial specialization for when both types are the same template<typename T> bool IsSameType(T first, T second) { return true; } int main() { std::cout << IsSameType(10, 'a') << std::endl; std::cout << IsSameType("Hello", "World") << std::endl; }

Das ist eine Möglichkeit, die Templatespezialisierung zu verwenden, aber es gibt ein anderes, häufigeres Szenario.

cpp

main

copy
#include <iostream>

// Primary template
template <typename T1, typename T2> // General case
void Template(T1 a, T2 b) { std::cout << "General" << std::endl; }

// Partial specialization for when `T1` is `bool`
template <typename T2> // Special case when the first type is `bool`
void Template(bool a, T2 b) { std::cout << "Special" << std::endl; }

int main()
{
Template(false, 25);
Template(100, 300);
}
123456789101112131415
#include <iostream> // Primary template template <typename T1, typename T2> // General case void Template(T1 a, T2 b) { std::cout << "General" << std::endl; } // Partial specialization for when `T1` is `bool` template <typename T2> // Special case when the first type is `bool` void Template(bool a, T2 b) { std::cout << "Special" << std::endl; } int main() { Template(false, 25); Template(100, 300); }
question mark

Was ist partielle Templatespezialisierung?

Select the correct answer

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 4. Kapitel 3

Fragen Sie AI

expand
ChatGPT

Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen

some-alt