C++ “À Virgule Flottante " Enum”
Je suis à la recherche d'une solution en utilisant le C++03 standard (je suis limité à l'utilisation de cette version de la norme pour plusieurs années encore). Solutions pour le C++11 sont également les bienvenus, mais ne sera pas "accepté" que la réponse à cette question.
Ce qui est une simple, concis que je peux représenter un ensemble de constantes de valeurs à virgule flottante comme un seul type (similaire à un enum) pour assurer la sécurité du type sans encourir des frais généraux et encore me permettre d'opérer sur les valeurs comme des flotteurs directement?
Le résultat final est que j'aimerais être capable de faire quelque chose comme ce qui suit:
enum FloatingPointEnum
{
VALUE1 = 0.1234f,
...
VALUEN = 0.6789f
};
float SomeFunction(FloatingPointEnum value)
{
float new_value;
/* perform some operation using "value" to calculate "new_value" */
new_value = static_cast<float>(value); //<- a simplistic example
return new_value;
}
Alors que je peux penser à plusieurs solutions, aucune n'est aussi propre/simple/simple que je le voudrais et je me dis que quelqu'un doit déjà avoir une solution élégante à ce problème (pourtant, je n'arrive pas à en trouver un dans ma recherche).
EDIT:
Je voudrais l'appel suivant à SomeFunction avec une valeur qui n'est pas spécifié directement une valeur dans le type énuméré à l'échec de compilation:
float nonEnumeratedValue = 5.0f
SomeFunction(nonEnumeratedValue);
float
, il ne serait pas de type sécurisé. Si il n'y a rien, vous ne pouvez pas manipuler comme des floats
directement. Pourriez-vous donner quelques exemples?Des exemples de code que vous souhaitez ne parviennent pas à compiler en raison de la sécurité de type serait utile.
OriginalL'auteur statueuphemism | 2013-10-16
Vous devez vous connecter pour publier un commentaire.
Il ya beaucoup de problèmes qui n'ont pas de solution élégante (et beaucoup qui n'ont pas de solution à tous). Ce qui vous fait penser à ce problème? Cette hypothèse est très défectueux. Le plus proche que vous pouvez obtenir est d'utiliser une classe wrapper.
C'est assez juste, et je ne vais pas dire que vous avez eu tort de demander, mais il n'est pas bon pour assumer une solution existe.
OriginalL'auteur Puppy
En C++11, vous pouvez utiliser
constexpr
à réaliser ce que vous voulez.Avec
constexpr
vous définir une constante de compilation. Cela ne fonctionne que pour littérale types, tels quefloat
. Car, dans le même temps, nous voulonsà l'échec, on ne peut pas utiliser un simple
typedef
. Au lieu de cela, nous utilisons de BoostBOOST_STRONG_TYPEDEF
.Maintenant, vous pouvez appeler la fonction uniquement avec les instances de
FloatingPointEnum
. Malheureusement, l'instanciation de la syntaxe n'est pas si agréable plusAlternativement, vous pouvez simplement utiliser la D langage de programmation, où virgule flottante les énumérations sont pris en charge et le code suivant fonctionne comme prévu:
Appel
SomeFunction
avec unfloat
résultats dansOriginalL'auteur Henri Menke
Une autre solution possible, pas toujours applicables, mais très propre, est d'utiliser précision fixe.
Permet d'imaginer que vous avez-vous enum contenant une certaine distance en mètres
alors vous pouvez tout simplement passer à l'utilisation mm
OriginalL'auteur mauro