El valor de un entero de tiempo de ejecución solo se puede verificar en tiempo de ejecución, ya que solo existe en tiempo de ejecución, pero si realiza una verificación en tiempo de ejecución de todos los métodos de escritura, puede garantizar su contenido. Puede construir una clase de reemplazo integral regular con las restricciones dadas para eso.
Para enteros constantes, puede utilizar una plantilla para aplicar tal cosa.
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);
}
};
El intento de crear esta clase con un valor de plantilla que no está dentro del rango causará un fallo de sustitución y un error de tiempo de compilación. Por supuesto, todavía requerirá adorno con operadores y otros para reemplazar int, y si desea garantizar en tiempo de compilación otras operaciones, tendrá que proporcionar funciones estáticas para ellas (hay formas más fáciles de garantizar la aritmética en tiempo de compilación).
Boost tiene una afirmación estática para las relaciones numéricas: http://www.boost.org/doc/libs/1_37_0/libs/mpl/doc/refmanual/assert-relation.html –
@In silico: intente y publique enlaces a la nueva versión de boost (1.44 al momento de la escritura) :) –
Creo que Clang ya tiene algún tipo de diagnóstico, en tiempo de compilación, cuando se asigna desde un tipo numérico grande a uno más pequeño. Supongo que gcc/visual también lo tendría. ¿Sería suficiente o quieres rangos bien delimitados? –