Wartość całkowita środowiska wykonawczego może być sprawdzana tylko w środowisku wykonawczym, ponieważ istnieje tylko w środowisku wykonawczym, ale jeśli sprawdzisz wszystkie metody zapisu w czasie wykonywania, możesz zagwarantować jej zawartość. Możesz zbudować klasyczną, zastępczą klasę zastępczą z określonymi ograniczeniami.
Dla stałych całkowitych można użyć szablonu do wymuszenia takiej rzeczy.
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);
}
};
Próba utworzenia tej klasy z wartością szablonu, która nie mieści się w zakresie, spowoduje niepowodzenie zastąpienia i błąd kompilacji. Oczywiście nadal będzie wymagać ozdoby z operatorami i innymi, aby zastąpić int, a jeśli chcesz, aby czas kompilacji gwarantował inne operacje, będziesz musiał zapewnić im funkcje statyczne (są prostsze sposoby na zapewnienie arytmetycznej kompilacji).
Funkcja Boost ma twierdzenie statyczne dla relacji numerycznych: http://www.boost.org/doc/libs/1_37_0/libs/mpl/doc/refmanual/assert-relation.html –
@In silico: proszę spróbować i opublikować linki do nowej wersji boost (1.44 od pisania) :) –
Myślę, że Clang ma już pewien rodzaj diagnostyki, w czasie kompilacji, kiedy przypisywanie z dużego typu numerycznego do mniejszego. Przypuszczam, że również gcc/visual. Czy to wystarczy, czy chcesz dobrze rozgraniczone zakresy? –