相关疑难解决方法(0)

在C++中输入safe(r)bitflags?

虽然修改一些老的C++代码,我在几个跑bitflags定义为枚举.

enum FooFlags
{
    FooFlag1 = 1 << 0,
    FooFlag2 = 1 << 1,
    FooFlag3 = 1 << 2
    // etc...
};
Run Code Online (Sandbox Code Playgroud)

这并不罕见,但是一旦你开始组合标志就会让你感到困扰,你会丢失类型信息.

int flags = FooFlag1 | FooFlag2;   // We've lost the information that this is a set of flags relating to *Foo*
Run Code Online (Sandbox Code Playgroud)

一些搜索结果显示我并不是唯一 一个被这个困扰的人.

一种替代方法是将标志声明为#defines或const积分,因此按位运算不会转换类型(可能).这个问题是它允许我们的位设置与不相关的标志,通过整数或其他枚举混合.

我熟悉std :: bitset和boost :: dynamic_bitset,但两者都不是为解决我的问题而设计的.我正在寻找的东西就像C#的FlagsAttribute.

我的问题是,对于(更多)类型安全的位标志,还有哪些其他解决方案?

我将在下面发布我自己的解决方案.

c++ enums bitflags type-safety c++11

23
推荐指数
3
解决办法
5309
查看次数

如何将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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

c c++ enums flags

3
推荐指数
1
解决办法
945
查看次数

标签 统计

c++ ×2

enums ×2

bitflags ×1

c ×1

c++11 ×1

flags ×1

type-safety ×1