有没有一种方法可以获取模板提供的大小?

时间:2020-06-11 19:22:38

标签: c++

我似乎记得有某种方法可以执行这样的操作,但是我找不到它:

template <int SIZE>
struct S {
  uint_least<SIZE>::type my_uint;  // <-- I made this up, but I am looking for something equivalent
};

有这样的事情吗?如果是这样,真正的语法是什么?

1 个答案:

答案 0 :(得分:0)

我最终这样做了:

#include <cstdint>

template <std::size_t N>
struct sized_ints : sized_ints<N-1>
{};

template <>
struct sized_ints<65>
{};

template <>
struct sized_ints<0>
{};

template <>
struct sized_ints<33>
{
    using int_fast_t = std::int_fast64_t;
    using int_least_t = std::int_least64_t;
    using uint_fast_t = std::uint_fast64_t;
    using uint_least_t = std::uint_least64_t;
};

template <>
struct sized_ints<64> : sized_ints<33>
{
    using int_t = std::int64_t;
    using uint_t = std::uint64_t;
};

template <>
struct sized_ints<17>
{
    using int_fast_t = std::int_fast32_t;
    using int_least_t = std::int_least32_t;
    using uint_fast_t = std::uint_fast32_t;
    using uint_least_t = std::uint_least32_t;
};

template <>
struct sized_ints<32> : sized_ints<17>
{
    using int_t = std::int32_t;
    using uint_t = std::uint32_t;
};

template <>
struct sized_ints<9>
{
    using int_fast_t = std::int_fast16_t;
    using int_least_t = std::int_least16_t;
    using uint_fast_t = std::uint_fast16_t;
    using uint_least_t = std::uint_least16_t;
};

template <>
struct sized_ints<16> : sized_ints<9>
{
    using int_t = std::int16_t;
    using uint_t = std::uint16_t;
};

template <>
struct sized_ints<1>
{
    using int_fast_t = std::int_fast8_t;
    using int_least_t = std::int_least8_t;
    using uint_fast_t = std::uint_fast8_t;
    using uint_least_t = std::uint_least8_t;
};

template <>
struct sized_ints<8> : sized_ints<1>
{
    using int_t = std::int8_t;
    using uint_t = std::uint8_t;
};