Templatspesialisering

Fra Wikipedia, den frie encyklopedi

Templatspesialisering er å definere et spesialtilfelle for en gitt type i en template.[1] 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.[2]

Eksplisitt templatspesialisering[rediger | rediger kilde]

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[rediger | rediger kilde]

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[rediger | rediger kilde]

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[rediger | rediger kilde]

  1. ^ «Template Specialization and Partial Specialization in C++ - Cprogramming.com». www.cprogramming.com. Besøkt 9. august 2016. 
  2. ^ «Why Not Specialize Function Templates?». www.gotw.ca. Besøkt 9. august 2016.