Full specialisering
Anpassa mallar för en typ
Full specialisering är en gratis lektion i C++ Academy på CoddyKit. Detta är lektion 1 av 4. Du kan läsa vilka 3 lektioner som helst i den här lärvägen kostnadsfritt i sin helhet – därefter låser CoddyKit PRO upp alla lektioner, plus praktisk övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Den ingår i lärvägen för C++ Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i C++ Academy innehåller totalt 4 lektioner.
Sammanfattning: mallar
En mall låter samma kod fungera för många typer. Kompilatorn genererar en konkret version för varje typ som Ni använder.
- Den generella formen hanterar alla typer.
- Ibland behöver en typ special behandling.
#include <iostream>
template <typename T>
T maxOf(T a, T b) { return a > b ? a : b; }
int main() {
std::cout << maxOf(3, 9) << ' ' << maxOf(2.5, 1.5) << '\n';
return 0;
}Vad är fullständig specialisering?
Fullständig specialisering tillhandahåller en helt separat implementation för en specifik typ och ersätter den generella mallen, men bara för den typen.
#include <iostream>
template <typename T>
void describe(T) { std::cout << "some type\n"; }
template <>
void describe(int) { std::cout << "an int\n"; }
int main() {
describe(3.14);
describe(42);
return 0;
}Syntaxen
En fullständig specialisering börjar med tomma vinkelparenteser template <> och anger den exakta typen i specialiseringen.
#include <iostream>
template <typename T>
struct TypeName { static const char* get() { return "unknown"; } };
template <>
struct TypeName<bool> { static const char* get() { return "bool"; } };
int main() {
std::cout << TypeName<double>::get() << '\n';
std::cout << TypeName<bool>::get() << '\n';
return 0;
}Specialisera en klassmall
Hela klassmallar kan specialiseras, så att en typ får egna medlemmar och ett eget beteende som skiljer sig från primärmallen.
#include <iostream>
template <typename T>
struct Storage {
T value;
void show() { std::cout << "value: " << value << '\n'; }
};
template <>
struct Storage<bool> {
bool value;
void show() { std::cout << (value ? "true" : "false") << '\n'; }
};
int main() {
Storage<int> s{5}; s.show();
Storage<bool> b{true}; b.show();
return 0;
}Varför specialisera?
Specialisering hanterar typer som behöver en annan logik, till exempel const char* som behöver strängjämförelse i stället för pekarjämförelse.
#include <iostream>
#include <cstring>
template <typename T>
bool equal(T a, T b) { return a == b; }
template <>
bool equal(const char* a, const char* b) { return std::strcmp(a, b) == 0; }
int main() {
std::cout << std::boolalpha;
std::cout << equal(5, 5) << '\n';
std::cout << equal("hi", "hi") << '\n';
return 0;
}Specialisera en enskild medlem
För en klassmall kan Ni specialisera bara en medlemsfunktion för en viss typ och återanvända resten.
#include <iostream>
template <typename T>
struct Printer {
void print(T v) { std::cout << v << '\n'; }
};
template <>
void Printer<char>::print(char v) {
std::cout << "char: " << v << '\n';
}
int main() {
Printer<int>{}.print(7);
Printer<char>{}.print('A');
return 0;
}Den bästa matchningen går före den generella
När en fullständig specialisering finns för den exakta typen föredrar kompilatorn alltid den framför primärmallen.
#include <iostream>
template <typename T>
int rank() { return 0; }
template <>
int rank<double>() { return 99; }
int main() {
std::cout << rank<int>() << ' ' << rank<double>() << '\n';
return 0;
}Specialiseringen måste följa primärmallen
En specialisering måste deklareras efter att primärmallen har gjorts synlig. Annars har kompilatorn inget att specialisera.
#include <iostream>
template <typename T>
const char* kind() { return "generic"; }
template <>
const char* kind<float>() { return "float"; }
int main() {
std::cout << kind<int>() << ' ' << kind<float>() << '\n';
return 0;
}Specialisera std-mallar
Ni får specialisera vissa mallar i standardbiblioteket, till exempel std::hash, för Era egna typer så att de fungerar med hashbaserade behållare.
#include <iostream>
struct Point { int x, y; };
template <typename T>
struct Hasher { size_t operator()(const T&) { return 0; } };
template <>
struct Hasher<Point> {
size_t operator()(const Point& p) { return p.x * 31 + p.y; }
};
int main() {
Hasher<Point> h;
std::cout << h(Point{2, 3}) << '\n';
return 0;
}Värdespecialisering
Mallparametrar som inte är typer kan specialiseras för specifika värden, vilket är användbart för tabeller vid kompilering.
#include <iostream>
template <int N>
struct Fib { static const int value = Fib<N-1>::value + Fib<N-2>::value; };
template <>
struct Fib<0> { static const int value = 0; };
template <>
struct Fib<1> { static const int value = 1; };
int main() {
std::cout << Fib<10>::value << '\n';
return 0;
}Håll beteendet konsekvent
En specialisering bör följa samma konceptuella kontrakt som den primära mallen; det är bara implementationen som ändras. Annars blir den anropande koden överraskad.
#include <iostream>
template <typename T>
T zero() { return T{}; }
template <>
int zero<int>() { return 0; }
int main() {
std::cout << zero<int>() << ' ' << zero<double>() << '\n';
return 0;
}Snabbtest
Testa er förståelse av syntaxen för fullständig specialisering.
Sammanfattning
Ni har lärt er om fullständig specialisering:
- tillhandahåller en särskild implementation för en enda exakt typ
- skrivs med
template <>och den konkreta typen - kompilatorn föredrar alltid en exakt specialisering
- fungerar för funktioner, klasser, enskilda medlemmar och specifika värden
Härnäst får ni se partiell specialisering, som matchar typmönster.
Lär dig C++ med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 51
- Lektioner
- 203
Vanliga frågor
Är lektionen ”Full specialisering” gratis?
Ja – du kan läsa vilka 3 lektioner som helst i lärvägen C++ Academy, inklusive ”Full specialisering”, kostnadsfritt i sin helhet här på webben. Därefter låser CoddyKit PRO upp alla lektioner, plus interaktiv övning med en inbyggd kodredigerare och en AI-lärare dygnet runt. Kursen i C++ Academy innehåller totalt 4 lektioner.
Vad lär jag mig i ”Full specialisering”?
Anpassa mallar för en typ Ni övar på C++ Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig C++ Academy?
Du behöver inga förkunskaper. Utbildningen i C++ Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 1 av 4.
Hur lång tid tar lektionen ”Full specialisering”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här C++ Academy-lektionen?
Ja. Varje C++ Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Full specialisering
- Partiell specialisering
- SFINAE
- Mönster med enable_if