Trong khi sửa đổi một số mã C++ cũ, tôi chạy qua một số bitflags được định nghĩa là enums.Nhập bitflags an toàn (r) vào C++?
enum FooFlags
{
FooFlag1 = 1 << 0,
FooFlag2 = 1 << 1,
FooFlag3 = 1 << 2
// etc...
};
Điều này không có gì lạ, nhưng nó làm phiền tôi rằng ngay sau khi bạn bắt đầu kết hợp cờ, bạn sẽ mất thông tin loại.
int flags = FooFlag1 | FooFlag2; // We've lost the information that this is a set of flags relating to *Foo*
Một số tìm kiếm trên SO cho thấy tôi không phải là onlyone phiền của thành viên này.
Một cách khác là khai báo cờ là #defines hoặc const integrals, do đó các thao tác bitwise sẽ không biến đổi loại (có thể). Vấn đề với điều này là nó cho phép bit của chúng tôi thiết lập để commingle với cờ không liên quan, thông qua ints hoặc enums khác.
Tôi quen thuộc với std::bitset và boost::dynamic_bitset nhưng không được thiết kế để giải quyết vấn đề của tôi. Những gì tôi đang tìm kiếm là một cái gì đó giống như C# 's FlagsAttribute.
Câu hỏi của tôi là, còn có giải pháp nào khác cho một tập hợp bitflags an toàn hơn?
Tôi sẽ đăng giải pháp của riêng mình bên dưới.
Bất kỳ cơ hội nào về ví dụ sử dụng cho việc triển khai của bạn? – Eric
@Eric, tôi cảm thấy nó khá thẳng về phía trước. Bạn thật ra đang tim cai gi? – luke
Một ví dụ đơn giản về khai báo một 'en' enum, khởi tạo một' FlagSet ', và sử dụng nó. Chắc chắn, tôi có thể làm việc nó ra, nhưng một ví dụ sẽ làm cho câu trả lời này tốt hơn. –
Eric