2013-07-22 14 views
5

Có rất nhiều cách để lặp qua enums liên tiếp nhưlặp thông qua các yếu tố enum không liên tiếp trong C++

enum Animal {Cat, Dog, Dolphin} 

Nhưng có một cách thuận tiện và dễ dàng để lặp qua các yếu tố enum không liên tiếp như

enum Animal {Cat = 0, Dog = 5, Dolphin = 8} 
+0

Không trực tiếp trên 'enum'. Tuy nhiên, bạn có thể tự đặt tất cả các phần tử của 'enum' trong một thùng chứa (' vectơ', 'bộ',' unordered_set', bất kỳ thứ gì ...) và sau đó lặp lại trên vùng chứa đó. – syam

+0

Bạn có nghĩa là bạn muốn một cái gì đó như 'cho (Animal a = Cat; a! = Dolphin; a ++)'? Trong khi điều này làm việc cho các điều tra đầu tiên, nó không phải là một cái gì đó tôi sẽ cá nhân đề nghị, vì nó có thể khó đọc và hiểu. –

+2

Bạn có thể tìm câu trả lời trong chủ đề này http: // stackoverflow.com/questions/261963/how-can-i-iterate-over-an-enum. – blitz

Trả lời

2

Câu trả lời ngắn gọn cho điều này là "không".

Bạn có thể tạo một bảng animals và sau đó sử dụng vòng lặp dải trên animals.

Dưới đây là một "bản demo" hoàn thành:

#include <iostream> 

using namespace std; 

enum Animal {Cat = 0, Dog = 5, Dolphin = 8}; 

int main() 
{ 
    Animal animals[] = { Cat, Dog, Dolphin }; 

    for(Animal a : animals) cout << a << endl; 
} 

Kết quả sẽ là:

0 
5 
8 
0

Tôi không chắc chắn rằng vấn đề thậm chí có ý nghĩa. Đó là tại bất kỳ tỷ lệ về cơ bản là không thể. Xem xét:

enum Animal 
{ 
    cat = 0, 
    dog = 5, 
    dolphin = 8, 
    canine = 5, 
    bear = 20 
}; 

Khi giá trị cơ bản là 5, bạn không có cách nào xác định dù nó đã được thiết lập bởi dog hoặc bằng canine, và vì vậy không có cách nào biết liệu giá trị tiếp theo nên dolphin hoặc bear. Bạn có thể đặt các giá trị trong một mảng và lặp lại điều đó, nhưng Tôi không thấy bất kỳ giải pháp nào khác.

Nói chung, tất nhiên, hầu hết thời gian bạn một cách rõ ràng giá trị ảnh hưởng như thế này này, bạn đang xác định một bitmask (ví dụ như std::ios_base::fmtflags), và trong trường hợp đó, nó làm cho không có tinh thần để lặp . Các trường hợp sử dụng khác mà tôi có thể nghĩ là giá trị đặc biệt (ví dụ: unset), mà bạn có thể muốn bỏ qua khi lặp lại hoặc từ đồng nghĩa (ví dụ: dog/canine ví dụ ở trên), trong trường hợp này, bạn ' d lẽ chỉ muốn ghé thăm một trong những từ đồng nghĩa và thực tế, bạn muốn ghi cái gì đó như:

enum Animal 
{ 
    cat, 
    dog, 
    canine = dog, 
    dolphin, 
    bear 
}; 

, và các thủ thuật lặp thông thường sẽ cho kết quả chính xác những gì bạn muốn .

1

Bạn cũng có thể cung cấp cho các nhà điều hành cần thiết (s) cho việc đếm:

enum Animal 
{ 
    Cat = 0 
    , Dog = 5 
    , Dolphin = 8 
}; 

inline Animal& operator++ (Animal &x) 
{ 
    switch (x) { 
    case Cat: 
     x = Dog; 
     break; 
    case Dog: 
     x = Dolphin; 
     break; 
    case Dolphin: 
    default: 
     x = static_cast<Animal>(static_cast<int>(x) + 1); 
     break; 
    } 
    return x; 
} 

DTTO cho postfix ++, < và bất cứ điều gì khác mà bạn cần. Tất nhiên, bạn phải giữ chúng đồng bộ với định nghĩa của liệt kê. Không thực sự đơn giản, nhưng nó là một lựa chọn.