gpt4 book ai didi

c++ - Typedef C++ 中的位域/掩码

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:55:53 25 4
gpt4 key购买 nike

我在 C++ 中遇到这个问题:我可以typedef 一个值来自枚举的位域吗?

代码将更具解释性:

typedef {
AUDIO = 0x01,
VIDEO = 0x02,
SUBTITLE = 0x04,
DATA = 0x08,
GUARD,
ALL = 0xFF
} my_enum_e;

// I'd like to replace 'unsigned int' by 'my_enum_e' or similar
int myFunction( unsigned int mask )
{
// code
}

// called like this:
myFunction( AUDIO|VIDEO|DATA );

在函数的原型(prototype)中,我想使用my_enum_e 作为输入值类型,这样在浏览代码时,您可以立即知道应该输入哪些值那里。

现在,将原型(prototype)更改为

int myFunction( my_enum_e mask );

使编译器提示转换错误。我无法通过像这样转换函数调用来修复它:

int myFunction( my_enum_e mask )
{
// code
}

myFunction( (my_enum_e)(VIDEO|AUDIO|DATA) );

但我觉得这很糟糕,我什至不确定它是否合法(它会截断该值吗??)。
你有解决方案吗?

最佳答案

| 和可能的其他运算符添加显式重载。

my_enum_e operator|(my_enum_e a, my_enum_e b) 
{ return my_enum_e(unsigned(a)|unsigned(b)); }

可以编写一个宏来为给定的位掩码类型定义所有需要的运算符。

#define BITMASK_OPERATORS(T)   T operator|(T a, T b) { return T(unsigned(a)|unsigned(b)); } \
T operator^(T a, T b) ...

关于c++ - Typedef C++ 中的位域/掩码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11613955/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com