Specjalizacja szablonow

0

Witam. Mam pytanie odnosnie specjalizacji szablonow, czesciowej specjalizacji. Czytam kurs Xiona

http://xion.org.pl/files/texts/mgt/html/2_4.html

No i nijak nie wiem po co specjalizowac szablony... Staja sie wtedy jak zwykle funkcje/klasy. Moglby mi ktos pokazac przyklad uzycia specjalizacji szablonow? Bede wdzieczny, pozdro ;)

0

Czasami dla konkretnego typu operacje, które wykonuje szablon muszą być inne. Gdybyś chciał np. zrobić funkcję, która dodaje wszystkie możliwe typy wbudowane do siebie i robi to zgodnie z ich znaczeniem, to nie ma problemu dla typów int, czy float. Jednak charów (powiedzmy, że ich znaczeniem są literki) nie da się dodawać a typ bool powinieneś dodawać zgodnie z regułami algebry Boole'a. Dlatego dla tych dwóch typów powinieneś specjalizować szablon, bo to (dodawanie) robi się inaczej niż dla pozostałych. Mało szczęśliwy ten przykład, bo jest abstrakcyjny a nie konkretny. ;-)

Znalazłem konkretniejszy przykład - funkcję, która konwertuje wszystko do stringów, uzywając std::stringstream i operatora << (zadziała dla każdej klasy, dla której przeciążony jest ten operator, całkiem poręczne)

template<typename T>
std::string toString(const T &value) {
  std::ostringstream stream;

  if (!(stream << value)) {
    // jakistam wyjatek
  }

  return stream.str();
}

Ale dla typu bool trzeba zrobić to inaczej, bo chcemy, żeby ładnie wyglądało:

template<>
std::string toString<bool>(const bool &value) {
  if (value) {
    return std::string("true");

  } else {
    return std::string("false");
  }
}
0

Inny przykład to obecny w bibliotece standardowej vector<bool>. Sam bool zajmuje co najmniej jeden bajt (na niektórych RISCach chyba nawet więcej), ale przechowuje tylko jeden bit danych. Vector<bool> jest specjalizacją szablonu vector<>, nie przechowuje booli w tablicy, tylko używa pól bitowych, dzięki czemu zajmuje 8 razy mniej pamięci niż zwykła tablica. Dodatkowe komplikacje pojawiają się np. z operatorem[], ale radzi sobie z tym zwracając specjalny obiekt obsługujący przypisanie i konwersje na bool.

0

Elegancko, juz mi lepiej ;) Wielkie dzieki za odp!

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0