poniedziałek, 7 września 2009

szablony w C++

Mechanizm szablonów w C++ umożliwia deklarowanie klas i funkcji sparametryzowanych typami lub wartościami. Klasa w C++ wprowadza przestrzeń nazw, w której można deklarować obiekty statyczne - daje to możliwość używania szablonów do deklarowania innych obiektów języka, nie tylko klas i funkcji - bezpośrednio nie byłoby to możliwe. Nie można na przykład zdefiniować szablonu tablicy, o tak:
template <class T>
T table[100];
Ale można uzyskać pożądany efekt w taki prosty sposób:
template <class T>
class t {
        public:
        static T table[100];
};

template <class T>
T t<T>::table[ 100 ];
Podobnie można postąpić z innymi kontrukcjami: Np. wyliczenie:
template <int N>
class t {
        public:
                enum en {
                        START=N,
                        STOP
                };
};
Szablonów można użyć do wielu nieoczywistych sztuczek. Oto jak można sprawdzić, czy dwa wyrażenia są tego samego typu:
template <class T>
bool same_type(const T&, const T&) {
        return true;
}

template <class T1, class T2>
bool same_type(const T1&, const T2&) {
        return false;
}

int main()
{
        std::cout << same_type(1, 2) << '\n';
        std::cout << same_type(1, 2.1) << '\n';
}
Kompilator oczywiście całkowicie optymalizuje taką funkcję - zamienia ją na stałą.