Giá trị tối đa và tối thiểu trong một enum C ++


81

Có cách nào để tìm giá trị xác định lớn nhất và nhỏ nhất của một enum trong c ++ không?



1
Một lý do khiến tôi có thể muốn biết giá trị tối đa của một enum mà không cần thêm nó vào chính enum đó là vì vậy trình biên dịch của tôi không phàn nàn (C4061) khi câu lệnh 'switch' của tôi không xử lý rõ ràng giá trị "max value".
snips-n-

Câu trả lời:


94

Không, không có cách nào để tìm các giá trị xác định lớn nhất và nhỏ nhất của bất kỳ enum nào trong C ++. Khi cần loại thông tin này, thông thường tốt là bạn nên xác định giá trị Cuối cùng và Giá trị Đầu tiên. Ví dụ,

enum MyPretendEnum
{
   Apples,
   Oranges,
   Pears,
   Bananas,
   First = Apples,
   Last = Bananas
};

Không cần phải đặt tên các giá trị cho mọi giá trị giữa FirstLast.


3
Vẫn hữu ích cho sự đếm không tuần tự - miễn là bạn không mong đợi mỗi giá trị để tồn tại
Adrian Cornish

@Adrian: Vâng, đó là sự thật. Bạn không cần mọi giá trị phải có một tên xác định để kỹ thuật này trở nên hữu ích. Tôi sẽ chỉnh sửa cho phù hợp
Jeff Yates

ok, nhưng bạn phải duy trì giá trị của nó nếu những cái mới được thêm vào.
Matt

30

Không, không có trong C ++ tiêu chuẩn. Bạn có thể làm điều đó theo cách thủ công:

enum Name
{
   val0,
   val1,
   val2,
   num_values
};

num_values sẽ chứa số lượng giá trị trong enum.


num_values ​​sẽ chứa các số-1 trong các giá trị
4pie0

12
@lizusek: num_valuessẽ chứa số lượng giá trị trong enum, ngoại trừ num_valueschính nó.
dalle

3
@dalie vâng, đó là lý do tại sao nó sẽ là: số giá trị - 1. Tất nhiên tôi biết rằng bạn muốn nói đến một giá trị có nghĩa là các giá trị không bao gồm giá trị cuối cùng không phải là giá trị thực mà là một trợ giúp. Tuy nhiên, tôi sẽ đề nghị làm cho nó rõ ràng hơn.
4pie0

1
@dalle Chỉ khi val0 = 0
user2470258

@ user2470258 như định nghĩa ở trên nó luôn luôn là 0.
men

6

Không. Một enum trong C hoặc C ++ chỉ đơn giản là một danh sách các hằng số. Không có cấu trúc nào cao hơn có thể chứa thông tin như vậy.

Thông thường khi tôi cần loại thông tin này, tôi đưa vào enum một giá trị tối đa và tối thiểu như sau:

enum {
  eAaa = 1,
  eBbb,
  eCccc,
  eMin = eAaaa,
  eMax = eCccc
}

Xem trang web này cho một số ví dụ về cách này có thể hữu ích: Ngu ngốc Enum Tricks


bài viết bạn liên kết là từ một thời gian mà các tác giả biên dịch "không hỗ trợ kiểu C ++ Boolean chính thức mới" .... Tôi chưa bao giờ đọc một cái gì đó cổ xưa trước đây: P.
idclev 463035818

4
  enum My_enum
    {
       FIRST_VALUE = 0,

       MY_VALUE1,
       MY_VALUE2,
       ...
       MY_VALUEN,

       LAST_VALUE
    };

sau định nghĩa, My_enum :: LAST_VALUE == N + 1


-1

Không tự động, nhưng bạn có thể thêm các giá trị enum nhân tạo để biểu thị các giá trị tối thiểu và tối đa, ví dụ:

typedef enum {start_of_colors=-1, eRed, eWhite, eBlue, eGray,
end_of_colors} eListOfTags;

for (eListOfTags i = start_of_colors+1; i < end_of_colors; i++) {
.... 
}

1
xem xét thêm một mô tả để trợ giúp cho câu trả lời.
Bibberty

-5

bạn thậm chí không cần chúng, những gì tôi làm chỉ là tôi nói ví dụ nếu bạn có:

enum Name{val0,val1,val2};

nếu bạn có câu lệnh switch và để kiểm tra xem giá trị cuối cùng đã đạt được chưa, hãy làm như sau:

if(selectedOption>=val0 && selectedOption<=val2){

   //code
}

15
Đây là một giải pháp rất mong manh. Nếu bạn thêm một giá trị enum mới, bạn phải khảo sát toàn bộ cơ sở mã của mình để cập nhật các thử nghiệm như vậy.
Marcelo Cantos
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.