gpt4 book ai didi

c++ - 函数采用枚举值或枚举值组合的模式

转载 作者:行者123 更新时间:2023-11-28 03:29:14 26 4
gpt4 key购买 nike

假设我有这个:

enum E{ 
a,
b,
c,
total
}

class A {
char mask; // supposed to contains combinations of values of the enum, like a or c, etc
}

是否有一个像样的解决方案来以用户友好的方式构建对象 A?例如我可以这样做:

A(E e) {
mask = 1 << e;
}

但这仅在您希望掩码仅由枚举的 1 个元素组成时才有效理想情况下,用户将能够执行以下操作:

A* a = new A(a | c)

这会自动创建

mask = 1 << a | 1 << c;

关于如何正确执行此操作的任何想法?谢谢

编辑

遗憾的是,我无法控制初始枚举,值以 1 递增 1

最佳答案

嗯,有简单的方法和丑陋的方法。

简单的方法是将位定义为不重叠的,例如:

enum E
{
a = 1 << 0,
b = 1 << 1,
c = 1 << 2,
total = 1 << 3 // or a | b | c, not sure what the intent was
};

丑陋的方式:

#define MAKEA(x) (new A((E_helper() | x).get()))

其中 E_helper 是一个重写 operator|(enum E) 的类。

class E_helper
{
unsigned accum;
public:
explicit E_helper(unsigned initial = 0) : accum(initial) {}
unsigned get() const { return accum; }
E_helper operator|(enum E e) const { return E_helper(accum | (1 << (unsigned)e)); }
};

然后你的用户可以说

A* p = MAKEA(a | c);

扩展为

A* p = (new A((A_helper() | a | c).get());

导致这一系列事件的原因

A_helper.operator|(a).operator|(c).get()

更好的是,将 .get() 调用移动到 A 的构造函数中,然后它采用 A_helper 类型的参数。这将使您发现用户忘记使用 MAKEA 宏的情况。

但是请注意,丑陋的方式暴露了违反直觉的行为。例如,A* p = MAKEA(a | c); 不同于 A* p = MAKEA( (a | c) );char mask =一个 | C; A* p = MAKEA(掩码);

关于c++ - 函数采用枚举值或枚举值组合的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13076210/

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