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)