2010-02-02 5 views

Trả lời

18

Nope.

Nếu có, bạn sẽ không nhìn thấy rất nhiều mã như thế này:

enum E { 
    VALUE_BLAH, 
    VALUE_OTHERBLAH, 
    ... 
    VALUE_FINALBLAH, 
    VALUE_COUNT 
} 

Lưu ý rằng mã này cũng là một gợi ý cho một (khó chịu) giải pháp - nếu bạn thêm một "bảo vệ" cuối cùng và không nêu rõ giá trị của các trường enum, sau đó phần tử "COUNT" cuối cùng sẽ có giá trị bạn đang tìm kiếm - điều này xảy ra vì số lượng enum không dựa trên số:

enum B { 
    ONE, // has value = 0 
    TWO, // has value = 1 
    THREE, // has value = 2 
    COUNT // has value = 3 - cardinality of enum without COUNT 
} 
+0

Cảm ơn, điều đó có vẻ như là một giải pháp tốt như tôi sẽ nghĩ ra. – rofrankel

+0

Tất nhiên chỉ hoạt động cho các enums liên tục. Nếu bạn đã từng có một 'lỗ hổng' như trong danh sách mã lỗi, thì bạn đã bị vặn. –

+0

Tôi đã đăng một macro đơn giản thực hiện thủ thuật và xử lý các vấn đề "lỗ". –

2

Không. Đối với một điều, bạn không thể lấy loại làm tham số (chỉ các kiểu của các loại)

3

Không, đây là VFAQ và câu trả lời là KHÔNG !!

Không phải không có kludging.

Ngay cả mẹo đó với mục nhập cuối cùng cũng chỉ hoạt động nếu không có giá trị nào không mặc định. Ví dụ:

enum B { 
     ONE, // has value = 0 
     TWO, // has value = 1 
     THREE=8, // because I don't like threes 
     COUNT // has value = 9 
     } 
+0

Cảm ơn. Xin lỗi vì đã lặp lại VFAQ - Tôi đã tìm kiếm cả ở đây và web lớn hơn và không thể tìm thấy bất kỳ trường hợp nào của câu hỏi này. – rofrankel

+0

Không sao cả. Tôi đã tìm kiếm nó thường đủ để tôi biết rằng các bậc thầy nói "cain't be dun" – Mawg

4

Có nhiều cách, nhưng bạn phải làm việc ... một chút :)

Về cơ bản bạn có thể lấy nó với một macro.

DEFINE_NEW_ENUM(MyEnum, (Val1)(Val2)(Val3 = 6)); 

size_t s = count(MyEnum()); 

Cách hoạt động?

#include <boost/preprocessor/seq/enum.hpp> 
#include <boost/preprocessor/seq/size.hpp> 

#define DEFINE_NEW_ENUM(Type_, Values_)\ 
    typedef enum { BOOST_PP_SEQ_ENUM(Values_) } Type_;\ 
    size_t count(Type_) { return BOOST_PP_SEQ_SIZE(Values_); } 

Lưu ý rằng độ dài cũng có thể là chuyên môn về mẫu hoặc bất kỳ thứ gì. Tôi không biết về bạn nhưng tôi thực sự thích sự biểu cảm của một "Trình tự" trong BOOST_PP;)

+1

+1 bởi vì nó hoạt động. Mặc dù tôi không chắc chắn tôi thích cú pháp khai báo. – ScaryAardvark

+0

Vâng, có một vài cấu trúc để lựa chọn (mảng, danh sách, trình tự và tuple), tôi có thể đã sử dụng một bộ dữ liệu cho 'DEFINE_NEW_ENUM (MyEnum, (Val1, Val2, Val3 = 6));'. Nó chỉ đơn thuần là một minh chứng về tính hữu ích của các macro :) –