numeric_limtis
-
std::numeric_limits<T>::is_integer - true if type is integer.
std::numeric_limits<T>::is_exact - true if type uses exact representations.
wo ist da der unterschied?und angenommen ich scheibe selbst eine numerische klasse, darf ich dann numeric_limits im std-namensbereich spezialisieren und da die attribute meiner klasse eintragen?
-
numeric_limits im std-namensbereich spezialisieren
Nein, unter Vorbehalt.
std::numeric_limits<T>::is_integer - true if type is integer.
std::numeric_limits<T>::is_exact - true if type uses exact representations.
wo ist da der unterschied?A sagt semantisch was anderes als B. Ich kann exakt sein, ohne dass ich Integer bin. Was sagt erstes und letzteres zu ratio?
-
numeric_limits im std-namensbereich spezialisieren
Ja, das darfst du für eigene Typen.
§17.6.4.2.1/1 schrieb:
A program may add a template specialization for any standard library template to namespace std only if the declaration depends on a user-defined type and the specialization meets the standard library requirements for the original template and is not explicitly prohibited.
Allerdings gibt es für
numeric_limitseine Ausnahme:§18.3.2.1/4 schrieb:
Non-arithmetic standard types, such as complex<T>, shall not have specializations.
-
knivil schrieb:
Was sagt erstes und letzteres zu ratio?
mein compiler hat keinen vollen c++11 support.
Arcoth schrieb:
Allerdings gibt es für
numeric_limitseine Ausnahme:§18.3.2.1/4 schrieb:
Non-arithmetic standard types, such as complex<T>, shall not have specializations.
ich bin mir nicht sicher ob ich das richtig verstehe. also numeric_limits darf einfach für std-member nicht überladen werden, ja? und complex<T> ist doch ein arithmetischer typ, zumindest simuliert er arithmetisches verhalten...
-
Nein,
complex<T>ist kein arithmetischer Typ, sondern eine Klasse. Zumindest nach Standard. Arithmetische Typen sindfloat,int,double,char, usw.ich bin mir nicht sicher ob ich das richtig verstehe. also numeric_limits darf einfach für std-member nicht überladen werden, ja?
So ist es.
mein compiler hat keinen vollen c++11 support.
Es ging ja nur ums Beispiel.
Übrigens, genau aus meiner oben genannten Ausnahme ist Knivils Tipp Unfug.
#include <ratio> #include <limits> static_assert( std::numeric_limits<std::milli>::is_specialized, "" ); // schlägt natürlich fehl
-
Übrigens, genau aus meiner oben genannten Ausnahme ist Knivils Tipp Unfug.
Welcher Tip?
http://en.cppreference.com/w/cpp/types/numeric_limits/is_exact :
While all fundamental types T for which std::numeric_limits<T>::is_exact==true are integer types, a library may define exact types that aren't integers, e.g. a rational arithmetics type representing fractions.
-
Ach, ich dachte, du meinst ganz konkret
std::ratio.
Natürlich, Bruchklassen sind ein gutes Beispiel.
(Das Problem wäre, dass die unspezialisierte Version immer noch alle Member hat, und man dann trotzdem auf sie zugreifen kann - auch wenn sie falsche Werte haben)