如何获取最接近的覆盖当前无符号类型所有范围的有符号类型?

问题描述 投票:0回答:1

在模板中,我有一个索引类型(

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
};
c++ std
1个回答
0
投票

实际上,通常平台上的案例数量确实没有那么大:

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>>;
© www.soinside.com 2019 - 2024. All rights reserved.