是否可以确定 ac 枚举类的元素数量?

新手上路,请多包涵

是否可以确定 c++ enum class 的基数:

 enum class Example { A, B, C, D, E };

我尝试使用 sizeof ,但是,它返回枚举元素的大小。

 sizeof(Example); // Returns 4 (on my architecture)

有没有获得基数的标准方法(在我的示例中为 5)?

原文由 bquenin 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 741
2 个回答

不是直接的,但您可以使用以下技巧:

 enum class Example { A, B, C, D, E, Count };

然后基数可用作 static_cast<int>(Example::Count)

当然,这只有在让枚举的值从 0 开始自动分配的情况下才能很好地工作。如果不是这样,您可以手动将正确的基数分配给 Count,这实际上与必须维护一个单独的常量没有什么不同反正:

 enum class Example { A = 1, B = 2, C = 4, D = 8, E = 16, Count = 5 };

一个缺点是编译器允许你使用 Example::Count 作为枚举值的参数——所以如果你使用它要小心! (不过,我个人认为这在实践中不是问题。)

原文由 Cameron 发布,翻译遵循 CC BY-SA 4.0 许可协议

这是在 2020 年对我有用的解决方案,使用 Visual Studio 2019

 #define Enum(Name, ...)                                                        \
    struct Name {                                                              \
        enum : int {                                                           \
            __VA_ARGS__                                                        \
        };                                                                     \
        private: struct en_size { int __VA_ARGS__; };                          \
        public: static constexpr  size_t count = sizeof(en_size)/sizeof(int);  \
    }


用法:

 struct S {

    Enum(TestEnum, a=11, b=22, c=33);

    void Print() {
        std::cout << TestEnum::a << '\n';
        std::cout << TestEnum::b << '\n';
        std::cout << TestEnum::count << '\n';
    }

};

int main()
{

    S d;
    d.Print();

    return 0
}

输出:

 11
22
3

原文由 The Oathman 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题