将位掩码整数和枚举存储在相同的值中。怎么样?

时间:2015-02-09 18:33:39

标签: c++ c enums legacy

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

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

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

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

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

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

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

任何人都可以想到任何巧妙的解决方案,如何以干净的方式将这些旧/新椅子写入/读取文件?

1 个答案:

答案 0 :(得分:4)

为新椅子分配不同的值,使它们不是一个小面具:

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