Có thể viết một hàm trả về số phần tử trong một enum không? Ví dụ, nói rằng tôi đã xác định:Có cách nào để tìm cardinality (kích thước) của một enum trong C++?
enum E {x, y, z};
Sau đó, f (E) sẽ quay trở lại 3.
Có thể viết một hàm trả về số phần tử trong một enum không? Ví dụ, nói rằng tôi đã xác định:Có cách nào để tìm cardinality (kích thước) của một enum trong C++?
enum E {x, y, z};
Sau đó, f (E) sẽ quay trở lại 3.
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
}
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)
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
}
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 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
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 :) –
Cảm ơn, điều đó có vẻ như là một giải pháp tốt như tôi sẽ nghĩ ra. – rofrankel
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. –
Tôi đã đăng một macro đơn giản thực hiện thủ thuật và xử lý các vấn đề "lỗ". –