Podręcznik
2. Szablony klas
2.4. Szablony parametrów szablonu
Stos to nie tylko struktura danych, ale również sposób dostępu do niej. Realizuje on regułę LIFO (Last In First Out), co oznacza, że ostatni dodany element jest pierwszy, który zostaje usunięty. W tym kontekście, sposób przechowywania danych na stosie nie jest istotny. Mogą to być na przykład tablice, jak w powyższych przykładach, ale równie dobrze mogą to być różne inne kontenery. W Standardowej Bibliotece Szablonów C++ stos jest zazwyczaj zaimplementowany jako adapter do jednego z już istniejących kontenerów. Ponieważ kontenery STL są szablonami, adapter stosu również może być zdefiniowany jako szablon, jak przedstawiono poniżej:
template<typename T, template<typename X > class Sequence=std::deque > class TCStos {
private:
Sequence<T> m_elementy;
public:
TCStos() {};
void wstaw(T val) {m_elementy.push_back(val);}
T zdejm() {
auto rv = m_elementy.back();
m_elementy.pop_back();
return rv;
}
bool czyPusty() {return m_elementy.empty();}
};
Dzięki temu elastycznemu podejściu stos może być łatwo dostosowywany do różnych potrzeb przechowywania danych. Oczywiście nie jest to jedyna możliwość. Można też użyć zwykłego parametru typu:
template<typename T, typename C> class TCStos {
private:
C m_elementy;
public:
...
};
I dalej wykorzystywać następująco:
TCStos<string, std::deque<double> > st ;
W przypadku użycia szablonu jako parametru szablonu zapewniamy konsystencję pomiędzy typem T i kontenerem C, uniemożliwiając pomyłkę podstawienia niepasujących parametrów. Uczciwość nakazuje jednak w tym miejscu stwierdzić, że właśnie takie rozwiązanie jest zastosowane w STL-u. Ma ono tę zaletę, że możemy adaptować na stos dowolny kontener, niekoniecznie będący szablonem.