Der Wert einer Laufzeit-Ganzzahl kann nur zur Laufzeit überprüft werden, da sie nur zur Laufzeit existiert. Wenn Sie jedoch eine Laufzeitprüfung für alle Schreibmethoden durchführen, können Sie deren Inhalt garantieren. Sie können eine reguläre integrale Ersetzungsklasse mit bestimmten Einschränkungen dafür erstellen.
Für konstante ganze Zahlen können Sie eine Vorlage verwenden, um so etwas zu erzwingen.
template<bool cond, typename truetype> struct enable_if {
};
template<typename truetype> struct enable_if<true, truetype> {
typedef truetype type;
};
class RestrictedInt {
int value;
RestrictedInt(int N)
: value(N) {
}
public:
template<int N> static typename enable_if< (N > lowerbound) && (N < upperbound), RestrictedInt>::type Create() {
return RestrictedInt(N);
}
};
Der Versuch, diese Klasse mit einem Vorlagenwert zu erstellen, der nicht innerhalb des Bereichs liegt, führt zu einem Ersetzungsfehler und einem Fehler bei der Kompilierung. Natürlich wird es immer noch Schmuck mit Operatoren usw. benötigen, um int zu ersetzen, und wenn Sie andere Operationen kompilieren wollen, müssen Sie statische Funktionen für sie bereitstellen (es gibt einfachere Möglichkeiten, die Arithmetik zur Kompilierzeit zu garantieren).
Boost hat eine statische Behauptung für numerische Beziehungen: http://www.boost.org/doc/libs/1_37_0/libs/mpl/doc/refmanual/assert-relation.html –
@In silico: Bitte versuchen Sie und post Links zu der neuen Version von Boost (1.44 zum Schreiben) :) –
Ich denke, dass Clang bereits eine Art von Diagnose, zur Kompilierungszeit, wenn von einem großen numerischen Typ zu einem kleineren zuweisen. Ich nehme an, gcc/visual hätte das auch. Wäre es ausreichend oder möchten Sie gut abgegrenzte Bereiche? –