【发布时间】:2020-05-22 10:20:13
【问题描述】:
如果枚举是continuous,有没有办法在 C++11 中检查?
给出一个非枚举值是完全有效的。在 C++14、C++17 或 C++20 中是否有类似类型特征的功能来检查枚举是否连续?这将在 static_assert 中使用。
一个小例子如下:
enum class Types_Discontinuous {
A = 10,
B = 1,
C = 100
};
enum class Types_Continuous {
A = 0,
B = 1,
C = 2
};
static_assert(SOME_TEST<Types_Discontinuous>::value, "Enum should be continuous"); // Fails
static_assert(SOME_TEST<Types_Continuous>::value, "Enum should be continuous"); // Passes
【问题讨论】:
-
意味着继续,它具有升序,或者意味着从零开始,然后为每个值 +1?
-
无法枚举枚举标签,因此无法从程序内部进行。
-
有趣。我正在按照模板编程的思路思考如何让编译器计算阶乘。您将使用两个边界 A 和 C 开始,模板函数通过 SFINAE 检查
enum中它们之间的所有值是否存在。可悲的是,我有一份日常工作,因此无法尝试将其写出来,尽管我会根据这种方法投票赞成答案。我很确定像 @barry 或 @sehe 这样的人可以做到。 -
@RoQuOTriX 您如何将值与标签匹配?您将如何检查标签的顺序?以及如何在编译时完成(
static_assert需要)?即使您无法做出“漂亮的解决方案”,也请无论如何写一个答案,因为我很好奇如何以通用方式完成。 -
@Someprogrammerdude 您所描述的是“漂亮”或好的解决方案。我的意思是“简单”的检查解决方案,你必须为每个枚举重写它,上帝保佑,我希望没有人这样做
标签: c++ c++11 c++14 c++17 c++20