【发布时间】:2018-12-10 22:55:09
【问题描述】:
Fundamental types 在 C++ 中的大小在 1 到 8(可能是 16)之间,在 64 位操作系统上。这意味着它们在内存中占用的位数不高于 128,即位数适合 uint8_t。
现在,假设我编写了一个需要这么多位数的函数。例如,假设它是
template <typename T>
inline void clear_bit(T& x, magic_type bit_index ) {
static_assert(std::is_fundamental_v<T>, "Go away.");
x = x & ~(T{1} << bit_index);
}
我想知道magic_type 使用什么:应该是uint8_t 吗?或者它应该只是一个 int,因为无论如何我都需要检查有效性,即使是 uint8_t 的情况,而 int 是一种更“自然”的数字类型?
为了让这个问题减少您的个人意见:通常认为其中一个选项更惯用吗?如果没有,你能找到两个选择的充分理由吗?或者也许建议第三个?
【问题讨论】:
-
您希望代码具有怎样的面向未来的能力?当 i25 1024bit 处理器出来时,你还想让代码工作吗?
-
考虑一下:如果你想要一个类似的
clear_bit函数作为某个位数组类的成员会发生什么?或者,如果您想要一个通用的clear_bit可以在任何任意位范围概念上运行怎么办?这就是你应该使用的类型。 -
我不确定什么是最好的,但如果你匹配操作类型
T那么我假设你不会失去任何东西,因为它可能会被提升为数学? -
我相信 LEWG 选择了
int来获得提议的轮换功能。 -
@Galik 源类型被限制为无符号,但旋转计数为
int。