从<字节数>和<符号>构造C++整数类型

Chr*_*isB 4 c++ templates std type-traits

  • 我有一个constexpr size_t byte_count,它是 1、2、4 或 8
  • 我有一个constexpr bool is_signed,这显然是真或假

我想用and为整数类型构造一个typedef/ 。usingTsizeof(T) == byte_countstd::is_signed_v<T> == is_signed

  1. <type_traits>在(或标准库的其他地方)有什么东西可以做到这一点吗?

  2. 否则,实现这一目标的最紧凑的方法是什么?

  • 我真的很喜欢一些不会对类型进行硬编码的简短内容,因为这将在多个地方使用,在这些地方引入辅助函数/类型很烦人(它在生成的代码内部......叹息)。

  • 我没有动力

我当前的解决方案:

#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);
}
Run Code Online (Sandbox Code Playgroud)

Art*_*yer 7

C++ 标准库中没有任何内容可以执行此操作。不幸的是,您必须自己实现映射。

您可以使用它std::make_signed_t来消除一半的情况。

像这样的东西:

template<std::size_t ByteWidth>
struct select_uint;

template<> struct select_uint<1> { using type = std::uint8_t; };
template<> struct select_uint<2> { using type = std::uint16_t; };
template<> struct select_uint<4> { using type = std::uint32_t; };
template<> struct select_uint<8> { using type = std::uint64_t; };

template<std::size_t ByteWidth, bool IsSigned>
using select_int_t = std::conditional_t<IsSigned,
    std::make_signed_t<typename select_uint<ByteWidth>::type>,
    typename select_uint<ByteWidth>::type>;
Run Code Online (Sandbox Code Playgroud)