C bitflag枚举应该如何转换为C ++?

C ++主要是C的超集,但并非总是如此。 特别是,虽然C和C ++中的枚举值都隐式转换为int,但反之则不然:只有在C中,int会转换回枚举值。 因此,通过枚举声明定义的bitflags无法正常工作。 因此,这在C中是可以的,但在C ++中则不行:

typedef enum Foo { Foo_First = 1<<0, Foo_Second = 1<<1, } Foo; int main(void) { Foo x = Foo_First | Foo_Second; // error in C++ return 0; } 

如何有效和正确地处理这个问题,理想情况下不会损害使用Foo作为变量类型的调试器友好性质(它会分解成手表中的组件位标志等)?

还要考虑可能有数百个这样的标志枚举,以及数千个使用点。 理想情况下,某种有效的运算符重载可以解决问题,但它确实应该是高效的; 我想到的应用程序是受计算限制的,并且具有快速的声誉。

澄清:我正在将一个大型(> 300K)的C程序翻译成C ++,所以我在运行时和开发人员时间都在寻找有效的翻译。 只需在所有适当的位置插入演员阵容可能需要数周时间。

为什么不把结果反馈给Foo?

 Foo x = Foo(Foo_First | Foo_Second); 

编辑:当我第一次回答这个问题时,我不明白你问题的范围。 以上将适用于做一些现场修复。 对于您想要做的事情,您需要定义一个| 获取2个Foo参数并返回Foo的运算符:

 Foo operator|(Foo a, Foo b) { return Foo(int(a) | int(b)); } 

int转换是为了防止不希望的递归。

这听起来像是一个演员的理想应用程序 – 由你来告诉编译器是的,你的意思是用随机整数实例化一个Foo。

当然,从技术上讲,Foo_First | Foo_Second不是Foo的有效值。

将结果保留为int或static_cast:

 Foo x = static_cast(Foo_First | Foo_Second); // not an error in C++