将位掩码整数和枚举存储在相同的值中。如何?

Storing bitmask integer and enum in the same value. How?

我有一个带有位掩码整数的旧类型(例如 0x0001、0x0002、0x0004、0x0008、...、0x4000)。我们决定重新设计整个东西,但具有向后兼容性。所以我们将所有内容都移到了一个枚举中,包括所有遗留类型。

想象一下我们在谈论椅子。枚举现在看起来像这样:

enum Chairs
{
    OldChair1,
    OldChair2,
    OldChair3,
    NewChair1,
    NewChair2
};

我们目前正在将椅子存放在一个文件中。对于旧椅子,它们由位掩码整数存储(例如 1、2、4、8、...、4000)。我们现在正尝试将新椅子存储在同一个文件中,同时保持向后兼容性。

我们不能写枚举的整数值,因为“4”在位掩码整数方面对应于 OldChair3,但在枚举方面对应于 newChair2。由于写入值必须向后兼容,因此它必须对应于 OldChair3.

我们想到了将旧椅子写为位掩码整数,将新椅子写为字符串的想法,使用我可以免费使用的一些 EnumToString 函数。这样,当它是整数时,我们知道它是一把旧椅子,否则就是一把新椅子。

但是,当从文件中读回值时,我没有任何 StringToEnum 可供使用,我也不想创建一个。由于创建 StringToEnum 需要我在多个位置指定可能的枚举值。在不久的将来,除了我自己之外,其他人可能会添加新椅子。

关于这些 old/new 椅子如何以干净的方式 written/read to/from 文件,谁能想出任何巧妙的解决方案?

为新椅子分配不同的值,使它们不会有点掩码:

enum Chairs
{
  OldChair1 = 0x00001,
  OldChair2 = 0x00002, 
  OldChair3 = 0x00004,
  NewChair1 = 0x80001,
  NewChair2  // 0x8002
 };