3 Stimmen

Minimal- und Maximalwerte für Integer-Variablen zur Kompilierzeit in C++

Gibt es eine einfache, saubere Art und Weise der Bestimmung zur Kompilierungszeit die maximalen und minimalen Werte für eine Variable von einigen (sonst unbekannt im Moment) Integer-Variable oder Typ? Mit Schablonen?

Zum Beispiel:

// Somewhere in a large project is:
typedef unsigned long XType;
typedef char YType;
// ...

// Somewhere else
   XType a;
   YType b;
   LONGLONG c,d,e,f;
   c = MinOfType(a); // Same as c = 0;
   d = MaxOfType(a); // Same as d = 0xffffffff;
   e = MinOfType(b); // Same as e = -128;
   f = MaxOfType(b); // Same as f = 127;
// Also would be nice
   e = MinOfType(YType); // Same as e = -128; // Using the typename directly
// Or perhaps
   e = MinOfType<YType>(); // Same as e = -128; // Using the typename directly

14voto

Naveen Punkte 71443

Verwenden Sie std::numeric_limits, es ist genau für diese Art von Anforderung. Sie können einen Blick auf Folgendes werfen Beispiel für die Verwendung.

9voto

moonshadow Punkte 81155

Überprüfen Sie boost ganzzahlige_Eigenschaften .

3voto

Siehe diese Frage Höchstwert von int - Sie können auch "min" an den Stellen verwenden, an denen in den Antworten "max" verwendet wurde.

0voto

seh Punkte 14708

Kopfzeile einbeziehen <limits> um die Vorlagenklasse zu erreichen std::numeric_limits . Der numerische Typ Ihrer Variablen wird verwendet, um eine Spezialisierung dieser Vorlagenklasse zu finden, die den maximalen Wert über die Funktion max() und den Mindestwert über min() sowie mehrere andere Facetten des Typs.

Beachten Sie, dass die Interpretation für Minimum ist für Integral- und Gleitkommatypen unterschiedlich. Für erstere ist es der negativste Wert für einen Typ mit Vorzeichen und Null für einen Typ ohne Vorzeichen, aber für letztere ist es der kleinste darstellbare Wert, der sehr nahe an Null liegt.

0voto

kalaxy Punkte 1528

Wenn Sie Zugang zu c++11 haben, können Sie eine Kombination aus decltype y std::numeric_limits . Wenn Sie Ihren Beispielcode umschreiben, würde er wie folgt aussehen:

#include <limits>

typedef unsigned long XType;
typedef char YType;

XType a;
YType b;
LONGLONG c,d,e,f;
c = std::numeric_limits< decltype(a) >::min(); // Same as c = 0;
d = std::numeric_limits< decltype(a) >::max(); // Same as d = 0xffffffff;
e = std::numeric_limits< decltype(b) >::min(); // Same as e = -128;
f = std::numeric_limits< decltype(b) >::max(); // Same as f = 127;
e = std::numeric_limits< YType >::min(); // Same as e = -128; // Using the typename directly

decltype zieht den Typ aus einem Ausdruck, in diesem Fall den Variablentyp, und ermöglicht die Verwendung an anderen Stellen, die einen Typ erwarten, z. B. in einer Vorlage. Und das alles geschieht zur Kompilierzeit, so dass Sie die Variable einem constexpr .

constexpr decltype(a) g = std::numeric_limits< decltype(a) >::min();

Aquí g wäre vom gleichen Typ wie a hätten den Wert 0 und würden alle zur Kompilierzeit bestimmt werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X