Templatspesialisering

Templatspesialisering er å definere et spesialtilfelle for en gitt type i en template. Noen ganger så ønsker man en mer optimisert eller mer meningsfull implementering av templaten for en bestemt type i stedet for å bruke den generiske implementasjonen. Det finnes to typer templatspesialiseringer; eksplisitt og partiell templatspesialisering. Begge kan brukes for alle typer templater, sett bort i fra funksjonstemplater. Funksjonstemplater kan ikke partielltemplatspesialiseres, men man kan oppnå tilnærmet samme effekt med «function overloading» (funksjonsoverlastning). Det er også verdt og nevne at man ofte ikke vil spesialisere funksjoner i det hele tatt, men heller bruke funksjonsoverlastning hvor man heller har separate funksjonsdefinisjoner for hver type og lar kompilatoren bestemme hvilken den skal kalle på basert på argumentene som gis til funksjonen. Dette er fordi en kompilator alltid vil prøve å gjøre en funksjonsoverlastning til en bedre kandidat enn enhver templatspesialisering.

 Eksplisitt templatspesialisering 
En eksplisitt templatspesialisering er å la alle parameterne i spesialiseringen være ikke-type templatparametere. Sagt på en annen måte, templatspesialiseringen jobber ikke med generiske typer i det hele tatt. Det er ofte dette man ønsker når man skal spesialisere for et enkelttilfelle. Det brukes ofte når man har en type som ikke kan bruke den generiske implementasjonen av en gitt template som i følgende tilfelle. Merk at samme effekt kan oppnås ved «function overloading» som ofte er foretrukket.template <typename T>
T max(T t1, T t2) {
    return t1 > t2 ? t1 : t2;
}

template <>
bool max<bool>(bool t1, bool t2) {
    return t1 || t2;
}

 Partiell templatspesialisering 
En partiell templatspesialisering er å la spesialiseringen være avhengig av både ikke-type og typetemplatparametere. En annen måte å si det på er at vi lar spesialiseringen være delvis generisk ved å ha typetemplatparametere som representerer den ukjente typen. Resten av parameterne er ikke-type parametere, altså ordinære typer. Man spesialiserer for noen typer, mens de resterende typene blir generiske.

 Eksempel 
Anta at det finnes en klassetemplate KeyValuePair med to templatparametere.template <typename Key, typename Value>
class KeyValuePair {};Følgende vil være en eksplisitt templatspesialisering av denne klassen med int som Key og std::string som Value.template <>
class KeyValuePair<int, std::string> {};Følgende er en partiell templatspesialisering av klassen, med typetemplatparameteren Key og std::string for templatparameteren Value.template <typename Key>
class KeyValuePair<Key, std::string> {};

 Referanser 

Kategori:C++