2. Szablony klas

2.5. Konkretyzacja na żądanie

Jak już wcześniej wspomniano, konkretyzacja szablonów w C++ może odbywać się "na żądanie", co oznacza, że kompilator będzie generować konkretne implementacje tylko dla tych części szablonu, które są faktycznie używane w kodzie. Jeśli, na przykład, nie używamy w kodzie funkcji TCStos<int>::zdejm(), to ta funkcja nie zostanie wygenerowana.

To zachowanie może być wykorzystane do konkretyzowania klas szablonów za pomocą typów, które nie spełniają wszystkich ograniczeń nałożonych na parametry szablonu. Warto jednak pamiętać, że wszystko będzie działać poprawnie tylko do momentu, gdy nie będziemy używać funkcji, które łamią te ograniczenia.

Przykładowo, załóżmy, że rozszerzamy szablon TCStos, dodając do niego możliwość sortowania (choć to może być sprzeczne z konceptem stosu, który tradycyjnie nie posiada operacji sortowania). Poniżej znajduje się uproszczony przykład:


template<typename T, template<typename X > class Sequence=std::deque > class TCStos {
    ...
    void sortuj() {
        std::bubble_sort(m_elementy,N);
    };
};

int main() {
    // Możemy teraz np. używać
    TCStos<std::complex<double> > sc;
    sc.wstaw( std::complex<double>(0,1));
    sc.zdejm();

    // ale nie można użyć
    sc.sortuj();
    // konkretyzacja jawna nie powiedzie się, bo kompilator będzie się 
    // starał skonkretyzować wszystkie składowe klasy Stack, w tym metodę sort().
    template TCStos<std::complex<double> >;

    ...
}

W powyższym przykładzie, funkcja `sortuj()` została dodana do szablonu TCStos. Chociaż sortowanie nie jest operacją stosu, to nadal możemy skompilować i uruchomić program, o ile nie używamy funkcji, które naruszają ograniczenia logiczne stosu. Jednak taka praktyka może prowadzić do kodu, który jest trudny do zrozumienia i utrzymania, dlatego zawsze warto zachować ostrożność i stosować zasady projektowania w zgodzie z intencjami danego komponentu.