- 我有一个
constexpr size_t byte_count
,它可以是1、2、4或8 - 我有一个
constexpr bool is_signed
,它显然不是真就是假
我想用sizeof(T) == byte_count
和std::is_signed_v<T> == is_signed
为整数类型T
构造一个typedef
/using
。
<type_traits>
(或标准库中的其他地方)中是否有这样做的东西?
1.否则,实现这一点的最紧凑的方法是什么?
- 我真的很喜欢一些简短的东西,不硬编码的类型,因为这将在多个地方使用,它是恼人的介绍助手函数/类型(它的内部生成的代码…叹气)。
- 我没有助推器。
我目前的解决方案:
#include <type_traits>
#include <tuple>
#include <cstddef>
#include <cstdint>
int main(){
constexpr size_t byte_count = 4; // either 1, 2, 4, or 8
constexpr bool is_signed = true; // either true or false
// I would like to have something shorter and less hardcoded than this
using T = std::conditional_t<
is_signed,
std::tuple_element_t<byte_count, std::tuple<int8_t, int16_t, int16_t, int32_t, int32_t, int32_t, int32_t, int64_t>>,
std::tuple_element_t<byte_count, std::tuple<uint8_t, uint16_t, uint16_t, uint32_t, uint32_t, uint32_t, uint32_t, uint64_t>>
>;
static_assert(sizeof(T) == byte_count);
static_assert(std::is_signed_v<T> == is_signed);
}
3条答案
按热度按时间xn1cxnb41#
C++标准库中没有任何东西可以做到这一点。不幸的是,您必须自己实现Map。
您可以使用
std::make_signed_t
来删除一半的案例。就像这样:
6fe3ivhb2#
您将不得不列出类型,但您可以使用helper函数使其更容易完成。看起来像是
whlutmcx3#
我认为没有什么比显式列出所有类型更好的了。
这可能类似于: