是否有可能在c ++中枚举枚举.我必须有类似的东西:
错误类型:
类型1:
类型2:
类型3:
这些中的每一个都是整数值.它们应该用在通信协议栈中.在接收端,接收器必须从接收的值中解码错误的类型和原因.如果不能使用枚举,最好的方法是什么?
我甚至不确定枚举的含义是什么意思.但通常的处理方法是在单个枚举中定义范围:
enum Errors
{
type1 = 0x000,
cause1,
cause2,
type2 = 0x100,
cause3,
cause4,
...
causeMask = 0xFF,
typeMask = 0xFF00
};
Run Code Online (Sandbox Code Playgroud)
或者简单地用单独的单词定义单独的枚举,并使用
unsigned(或者unsigned short,或者什么)以及针对不同原因的一些转换.
无论采用何种解决方案,我都会将其封装在一个类中,以便客户端代码只需处理errorType()
和errorCause(); errorCause()甚至可以是错误类型值的模板.(但在某个地方,您需要为每个类型值显式特化,因为编译器不会知道如何将值映射到导致类型.)
正如杰瑞所说,直接不可能。解决这个问题的一种方法是使用两个枚举。一种用于类别,一种用于子类别。
然而,正如 geogesl 所说,在协议中这样做可能会很危险。您绝对应该明确定义枚举值:
struct Error
{
enum Type {
UNKNOWNTYPE = 0,
TYPE1 = 1,
TYPE2 = 2,
TYPE3 = 3
};
enum Subtype {
UNKNOWNSUBTYPE = 0,
// subtype for error type 1
CAUSE1 = 1001,
CAUSE2 = 1002,
CAUSE3 = 1003,
// subtype for error type 2
CAUSE4 = 2001,
CAUSE5 = 2002
};
Type type;
Subtype subtype;
};
int main()
{
Error error;
error.type = Error::TYPE1;
error.subtype = Error::CAUSE1;
}
Run Code Online (Sandbox Code Playgroud)
请务必明智地选择号码以供将来扩展。
更新:使示例实际工作。
替代的、类型更安全的解决方案:
struct ErrorType
{
enum type {
UNKNOWNTYPE = 0,
TYPE1 = 1,
TYPE2 = 2,
TYPE3 = 3
};
};
struct ErrorSubtype
{
enum type {
UNKNOWNSUBTYPE = 0,
// subtype for error type 1
CAUSE1 = 1001,
CAUSE2 = 1002,
CAUSE3 = 1003,
// subtype for error type 2
CAUSE4 = 2001,
CAUSE5 = 2002
};
};
struct Error
{
ErrorType::type type;
ErrorSubtype::type subtype;
};
int main()
{
Error error;
error.type = ErrorType::TYPE1;
error.subtype = ErrorSubtype::CAUSE1;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6277 次 |
| 最近记录: |