Wzorzec numeric_limits

tech • 303 słowa • 2 minuty czytania

Standardowa biblioteka języka C++ zawiera wiele ciekawych i przydatnych narzędzi w codziennej pracy developera C++, a po wejściu w życie C++0x będzie jeszcze ciekawiej. Czasem nawet nie mamy świadomości lub zapominamy o ciekawych perełkach jakie można tam znaleźć.

Jednym z zapomnianych i chyba rzadko używanych komponentów biblioteki STL jest szablon numeric_limits będący “odłamkiem” numerycznej części biblioteki. Wzorzec ten wraz z specjalizacjami dla typów wbudowanych zdefiniowany jest w pliku nagłówkowym limits. Jego przeznaczeniem jest dostarczenie informacji o cechach typów numerycznych.

Do “wyciągnięcia” właściwości typu wystarczy użyć tego wzorca sparametryzowanego danym typem. Na przykład łatwo możemy dowiedzieć się jakie minimalne i maksymalne wartości liczbowe dany typ może zmieścić:

using namespace std;

cout << "min(int):          " << numeric_limits<int>::min() << endl;
cout << "max(int):          " << numeric_limits<int>::max() << endl;

cout << "min(unsigned int): " << numeric_limits<unsigned int>::min() << endl;
cout << "max(unsigned int): " << numeric_limits<unsigned int>::max() << endl;

cout << "min(long):         " << numeric_limits<long>::min() << endl;
cout << "max(long):         " << numeric_limits<long>::max() << endl;

cout << "min(float):        " << numeric_limits<float>::min() << endl;
cout << "max(float):        " << numeric_limits<float>::max() << endl;

w wyniku czego otrzymamy interesujące nas dane:

min(int):          -2147483648
max(int):          2147483647
min(unsigned int): 0
max(unsigned int): 4294967295
min(long):         -2147483648
max(long):         2147483647
min(float):        1.17549e-38
max(float):        3.40282e+38

Oczywiście min i max to tylko czubek góry lodowej, numeric_limits zawiera dużo więcej informacji, nie będę ich tutaj przytaczał, można je znaleźć w dowolnej dokumentacji STL-a.

Rzeczą nie wymagającą chyba wspomnienia jest to, iż dla typów zdefiniowanych przez użytkownika, czyli naszych typów, powinniśmy dostarczy skonkretyzowane dla tych typów wersje wzorca numeric_limits, jeśli przewidujemy jego wykorzystanie z tymi typami.

W zamierzeniu, tak jak funkcje inline i wzorce, numeric_limits miał zastąpić uzywanie niebezpiecznych makr określających maksymalne i minimalne wartości dla niektórych typów, jak chociażby makra INT_MIN, INT_MAX. Jak widać udało się to z nawiązką, numeric_limits dostarcza o wiele więcej pożytecznych informacji o typach.

Komentarze (0)

Dodaj komentarz

/dozwolony markdown/

/nie zostanie opublikowany/