Почему size_type в std :: array size_t и в std :: vector обычно size_t? - PullRequest
6 голосов
/ 07 ноября 2019

В документации сказано, что size_type из std::vector - это / обычно / size_t, что является разумным, поскольку реализация может выбрать другое.

Но почему size_type = size_t в std::array. Особенно здесь, поскольку std::array часто используется для небольших µC, было бы лучше предоставить реализации некоторую свободу.

Это дефект документа?

1 Ответ

1 голос
/ 07 ноября 2019

Это определено так, потому что size_t определено как достаточное для всех массивов. Если вы хотите меньший тип для меньших массивов, вы всегда можете при необходимости сузить на основе значений constexpr.

template <typename Array>
struct small_array_size
{
    using type = size_t
};

template <typename T, size_t N, typename = std::enable_if_t<N < 256>>
struct small_array_size<std::array<T, N>>
{
    using type = uint8_t;
};

template <typename T, size_t N, typename = std::enable_if_t<N < 65536>>
struct small_array_size<std::array<T, N>>
{
    using type = uint16_t;
};

template <typename Array>
using small_array_size_t = typename small_array_size<Array>::type;
...