在模板中,我有一个索引类型(
IndexType
),它是unsigned
类型,需要为偏移量创建一个成员,该成员可以为负数,但应包含初始无符号类型的所有范围。实际上,这意味着它必须是下一个更大的有符号整数大小。
同时,我不想分配最大可能的有符号类型(如
std::ptrdiff_t
)以节省空间,因为 signed short
在内存方面可能更适合 unsigned char
。
我可以用
std::conditional
为所有可能的组合制作非常复杂的 sizeof
,但这会太冗长。有什么简单的解决方案吗?
目前我不需要大于
std::ptrdiff_t
的大小,因此任务“如果您需要大于所有内置原始整数类型的大小怎么办?”可以推迟。
template <typename IndexType> // Here I get unsigned type of index
struct Offset {
IndexType offs; // Here I need a type which will be signed, but enough to keep unsigned values of IndexType, but not unnecessary large
};
实际上,通常平台上的案例数量确实没有那么大:
template <std::unsigned_integral T>
using Offset = std::conditional_t<sizeof(T) == 1, int16_t,
std::conditional_t<sizeof(T) == 2, int32_t, int64_t>>;