2009-11-22 6 views
1

En ce moment je suis générer un recenseur aléatoire en utilisant la bibliothèque aléatoire de boost. Fondamentalement, j'utilise une conversion implicite pour spécifier la distribution du générateur aléatoire, obtenir un nombre aléatoire, puis le renvoyer au type énuméré.Boost :: Types aléatoires et énumérations

Ex: (minColor et Maxcolor sont des paramètres du type dénombrée)

boost::mt19937 randGen(std::time(0)); 
boost::uniform_int<> dist(minColor, maxColor); 
boost::variate_generator< boost::mt19937&, boost::uniform_int<> > 
    GetRand(randGen, dist); 

return static_cast<Common::Color> (GetRand()); 

Je suis curieux de savoir si la bibliothèque boost soutient tout comme la création d'une distribution pour un type énuméré et renvoie ainsi un recenseur choisi au hasard. Quelque chose comme ...

boost::uniform<Common::Color> dist(minColor, maxColor); 

Répondre

0

Bien qu'il serait logique avec C++ 0XS fortement typé énumérations, ce que vous wan't est en général pas possible.

terminologie Enumeration distingue le type d'énumération et son type sous-jacent qui contient les valeurs de l'énumération.
La norme exige principalement que le type sous-jacent soit suffisamment grand pour contenir toutes les valeurs, ne soit pas plus grand que int si possible et que la taille retournée par sizeof(someEnum) soit égale à la taille de son type sous-jacent (§7.2.5 C++ 03) . Compte tenu de cela et sans restreindre le style de la façon dont les enums sont utilisés/déclarés, nous connaissons la taille des énumérations, mais pas leur signature, ce qui fait par exemple. définition de constructeurs sécurisés prenant min et max arguments impossibles.

Sidenote:
Je trouve personnellement une distribution qui est templated avec un type d'énumération quelque peu trompeur.
La distribution est-elle définie uniquement pour les valeurs d'énumération comprises dans la plage?
Ou est-il défini pour toutes les valeurs du type sous-jacent comprises dans la plage?