2012-06-06 81 views
2

可能重複:
generating random enumsc + +隨機分配一個枚舉類型的變量

可以說我有以下幾點:

enum Color {   
    RED, GREEN, BLUE 
}; 
Color foo; 

我希望能夠有什麼要做的是將foo隨機分配給一種顏色。令人生厭的方式是:

int r = rand() % 3; 
if (r == 0) 
{ 
    foo = RED; 
} 
else if (r == 1) 
{ 
    foo = GREEN; 
} 
else 
{ 
    foo = BLUE; 
} 

我想知道是否有更乾淨的方式來做到這一點。我已經嘗試(並失敗)以下內容:

foo = rand() % 3; //Compiler doesn't like this because foo should be a Color not an int 
foo = Color[rand() % 3] //I thought this was worth a shot. Clearly didn't work. 

讓我知道如果你們知道任何更好的方式,不涉及3 if語句。謝謝。

+0

嘗試富=的static_cast (蘭特()%3); ?? – 2012-06-06 08:36:53

回答

7

您可以將一個int值賦給一個枚舉值,例如,

Color foo = static_cast<Color>(rand() % 3); 

作爲一種風格,您可能希望使代碼更健壯/可讀,例如,

enum Color {   
    RED, 
    GREEN, 
    BLUE, 
    NUM_COLORS 
}; 

Color foo = static_cast<Color>(rand() % NUM_COLORS); 

這樣,如果您添加或在將來的某個時候卸下的顏色/從Color,有人讀你的代碼沒有劃傷自己的頭,不知其中常量3的代碼仍然有效來自。

+2

非常感謝。並感謝您提供我從未想過的樣式提示,但它非常聰明! – user1413793

+0

@PaulR,OP:請注意,這是基於(有效)假設枚舉範圍是連續的 - 情況並非總是如此。 – einpoklum

1

所有你需要的是一個投:

foo = (Color) (rand() % 3); 
+1

它被標記爲C++雖然 - 使用C++類型轉換,而不是C類型轉換。 –

+1

壞習慣永遠不會死......但我會讓它那樣,因爲否則它會和你的答案完全一樣。 – slaphappy

+0

@Paul兩者有什麼區別? – user1413793