C++静态断言只存在某些枚举值



我有一个枚举,它看起来像这样:

enum class States{
STATE_A,
STATE_B,
STATE_C,
STATE_D,
STATE_E
}

我在某个地方有一个警卫在检查:

if( state == STATE_A || state = STATE_C || state == STATE_D || state == STATE_E)

因此不包括CCD_ 1。我故意这样做是为了让另一个国家的加入不会改变现有的行为。这里的问题是,我是否可以同时拥有这两者,这意味着编写state != STATE_B的便利性和针对States枚举更改的编译时健壮性。

我认为这可以用static_assert以某种方式完成,但我该怎么做呢?各州没有任何赋值,也没有特定的排序。

这听起来很像Ada 2012中引入的带有静态谓词的子类型的概念。类似于您问题的一个例子是

with Ada.Text_IO; use Ada.Text_IO;
procedure Main is
type states is (A, B, C, D, E);
subtype valid_states is states with
Static_Predicate => valid_states in A | C | D | E;
begin
--  Insert code here.
null;
end Main;

上面的类型states是一个包括值A到E的枚举。子类型valid_states是不包括B的状态的子集。valid_states的每个实例也是状态的一个实例,但valid_states的任何实例都不能包含值B。

我相信你需要定义一个States类,然后从中派生出一个不包括B.的子类

最新更新