2016-11-27 20 views
9

Bir numaralandırma güvenli bir şekilde bir numaralandırma gelen bir öğeyi rasgele seçmek için bir yolu var mı?Rastgele bir numaralandırma ile güvenli bir şekilde en son C++ ile bir öğe seçin

Bunu bulabilmem için en iyi yol, enum öğesinin son öğesi olarak bir sonlandırıcı değeri sunmaktır, böylece kaç değer olduğunu bilirsiniz, sonra uygun aralıkta rastgele bir tam sayı oluşturur. enum'a yayınlamak. Ancak bir sonlandırıcı değeri hiçbir şeyi temsil etmiyor, bu nedenle geçersiz bir enum değeriniz var ve bu tür güvenli değil. En son C++ standartlarında bunu yapmak için daha iyi bir yolu var mı? "Bir enum kaç değerleri belirleme evrensel, tip-güvenli yol var?"

+1

İlginç soru için iyi bir kullanım durumunda gibi görünüyor, ama hepsi aşağı kaynar Ve bunun cevabı, ne yazık ki, hayır. Standart deyim, bahsettiğiniz gibi, enumda bir sentinel değer eklemek, ancak çirkin olduğuna katılıyorum. Diğer tek çözümün, enumuzu temsil etmek için bir tür gizli örtülü dönüşüm sağlaması için özel bir sınıf yazmak gerçekten olurdu, ama bu neredeyse kesinlikle aşırı bir şekilde tasarlanmış. Ayrıca, ilk bakışta göründüğünden daha da kötüleşir: Bir enumdaki değerler doğrusal olarak artmak zorunda değildir; atlar ve süreksizlikler olabilir. –

cevap

3

Bu std::map

std::map<std::string, const int> nicer_enum {{"Do", 3}, {"Re", 6}, {"Mi", 9}}; 

std::cout << nicer_enum["Re"] << '\n'; // 6 

auto elem = nicer_enum.cbegin(); 
std::srand(std::time(nullptr)); 
std::advance(elem, std::rand() % nicer_enum.size()); 
std::cout << elem->second << '\n'; // 3, 6 or 9 

for (const auto &kv : nicer_enum) 
     std::cout << kv.first << ": " << kv.second << ' '; // Do: 3 Mi: 9 Re: 6 

std::cout << '\n'; 
+0

Güzel! Ama pre-C++ 11 teknikleri yerine '' ve 'std :: string' kullandıysanız daha iyi olurdu. – Rakete1111

+0

Anlaştık, ancak cevabımın ilgili bölümünün dikkatini dağıtmak istemedim. (Ve muhtemelen harita tuşlarını yeniden boyutlandırmamalısınız). –

+0

@RayHamel: 'const char *' * kullanımı, * cevabınızın ilgili bölümünün dikkatini dağıtır. –

İlgili konular