1

Edit2:伙计们,对不起,但我发现答案被标记为重复而没有实际检查它是否解决了一个人的问题,这很烦人。建议的 SO 答案不符合所述问题。它是固定数量的变量与可变数量的变量+整数范围和整数值的可变组合。如果您仍然认为正确的方向,那么请为我陈述的问题提供有效的解决方案,或者如果您不能这样做,请不要将其简单地标记为重复。

我试图找到最优雅的方式来定义位掩码。此位掩码是一个整数,它定义了地图上对象的可见性(32 个级别,因此位 0..31 定义了 32 个级别中每个级别的可见性)。

我最想拥有的:

int visibilityMask = CreateVisibilityMask(0..12, 16, 22);

因此,上面将是一个创建位掩码的可变参数函数,其中 .. 需要重载以自行创建位掩码,然后将其与其他值进行或运算。

我想这个真的很难。但这不可能吗?

编辑:对不起,伙计们,但如果您认为此答案与您建议的答案重复,请创建一个示例,说明如何根据我的需要使用另一个答案。提供的答案不允许变量中的范围和单个 int 值的任何组合 - 如果您认为它很容易解决,请提供。

注意:最初的问题是关于重载“..”,这是不可能的。感谢您对此进行澄清。

4

2 回答 2

1

不,但你可以这样做:

#define bitrange(from,to)  (unsigned(-1) >> from << from << (sizeof(int)-to) >> (sizeof(int)-to)) 

int visibilityMask = bitrange(0,12)  |  1<<16  |  1<<22;

回答评论线程(这对于评论来说太长了)。

我现在只用 C+11 编写。大多数情况下,它是复杂的元编程库。

在这种情况下,我自己会使用 constexpr 函数。尽管事实上我已经向 GCC 和 CLANG (gcc-54648,clang-13970) 提交了几个 conexpr 错误。

这是一个快速而肮脏的代码,展示了如何做到这一点。我写了“类似这样的东西”。对我来说,用 constexpr 重写它是微不足道的,但我不会。我已经为 OP 编写了这个,它可能没有 C++11 编译器,并且可能不知道 constexpr 是什么。OP 没有询问样式指南,他需要解决方案。如果你们有更好的解决方案,请发布您的答案。

于 2013-05-03T12:44:22.177 回答
0

我试图找到最优雅的方式来定义位掩码。

考虑std::bitset代替?

于 2013-05-03T12:15:47.433 回答