Podręcznik
2. Szablony klas
2.2. Szablony klas
Rozwiązaniem są znów szablony, tym razem szablony klas. Podobnie jak w przypadku szablonów funkcji, szablon klasy definiuje nam w rzeczywistości całą rodzinę klas. Szablon klasy TCStos możemy zapisać następująco:
template<typename T> class TCStos {
public:
static const size_t N=100;
private:
T m_elementy[N];
size_t m_szczyt{0};
public:
TCStos():m_szczyt(0) {};
void wstaw(T val) {m_elementy[m_szczyt++]=val;}
T zdejm() {return m_elementy[--m_szczyt];}
bool czyPusty() {return (m_szczyt==0);}
};
int main() {
// Tak zdefiniowanego szablonu możemy używać podając jawnie jego argumenty:
TCStos<string> st ;
st.wstaw("ania");
st.wstaw("asia");
st.wstaw(("basia");
while(!st.czyPusty() ) {
cout << st.zdejm() << endl;
}
return 0;
}
Dla szablonów klas nie ma możliwości automatycznej dedukcji argumentów szablonu, ponieważ klasy nie posiadają argumentów wywołania, które mogłyby do tej dedukcji posłużyć. Jest natomiast możliwość podania argumentów domyślnych, wtedy możemy korzystać ze stosu bez podawania argumentów szablonu i wyrażenie poniżej będzie prawidłowe.
template<typename T=int> class TCStos {
public:
...
};
int main() {
TCStos st; // równoważne TCStos<int> st;
...
}
Dla domyślnych argumentów szablonów klas obowiązują te same reguły, co dla domyślnych argumentów wywołania funkcji. Należy pamiętać, że każda konkretyzacja szablonu klasy dla różniących się zestawów argumentów jest osobną klasą.