gpt4 book ai didi

C++ 从枚举值中获取位移位

转载 作者:太空宇宙 更新时间:2023-11-03 10:27:17 25 4
gpt4 key购买 nike

假设我有一个用于标志的枚举,即

enum Flags { Flag1 = 1 << 0, Flag2 = 1 << 1, Flag3 = 1 << 2 };

如果给我一个 Flags 值,我想知道该值的位移是多少。本质上,对于 Flag1 我想返回 0,对于 Flag2 我想返回 1,等等。除了使用函数之外,任何人都可以想到一种方法来做到这一点使用 switch 语句。

我想要这个是因为我有一个数据数组,函数的返回值是这个数组的元素之一。返回哪个元素取决于传递给函数的标志。

我想要一种更简洁的方法来执行以下操作。尤其是如果我修改了枚举,则不需要返回并修改此函数。

myobj* objects[3] = { obj1, obj2, obj3 };

myobj* GetObj(Flags FlagValue)
{
switch(FlagValue)
{
case Flag1:
return objects[0];
case Flag2:
return objects[1];
case Flag3:
return objects[2];
}
}

最佳答案

您需要的是一个计算枚举值中尾随零的函数。有很多方法可以做到这一点(参见 https://graphics.stanford.edu/~seander/bithacks.html#ZerosOnRightLinear ),但大多数现代平台通常提供专门的 CPU 指令来完成这项工作。由于该语言没有相应的运算符,因此只能通过非标准的特定于编译器的方式访问该指令,例如 GCC 中的 __builtin_ctz 或 MSVC 中的 _BitScanReverse

但是,如果您只使用编译时值,则更好的 C++ 解决方案应该是

template <unsigned N> struct ctz {
static const unsigned value = ctz<N - 1>::value + 1;
};

template <> struct ctz<1> {
static const unsigned value = 0;
};

template <> struct ctz<0>; // Left undefined

...
cout << ctz<Flag2>::value << endl;

关于C++ 从枚举值中获取位移位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29283969/

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