Получить количество инициализированных constexpr членов std :: array - PullRequest
1 голос
/ 15 марта 2019

Я инициализирую массив std :: во время компиляции со списком инициализаторов, и я хотел бы иметь способ для хранения количества элементов.std::array::size() вернул бы размер всего массива, и это не то, что я искал.

Как я могу улучшить приведенный ниже код?Большое спасибо!

#include <array>

constexpr std::array<int, 5> a{{1, 2, 3}};

constexpr size_t element_count(const std::array<int, 5> &a) { return ???; }

int main() { static_assert(element_count(a) == 3); }

Я компилирую с g++ (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0.

Ответы [ 2 ]

2 голосов
/ 15 марта 2019

Нет способа сделать это красиво в C ++ 14. Тип массива фиксируется в его объявлении и остается неизменным независимо от количества элементов, фактически инициализированных ненулевыми значениями.

В C ++ 17 вы просто сделали бы

std::array arr{1, 2, 3, 4};

Но в C ++ 14 вам придется использовать auto переменную и make_array тип функции. Если хотите, я могу показать пример кода.

P.S. Фактически, отсутствие автоматического вычитания длины массива с std::array было единственной причиной, по которой я использовал массивы в стиле C в некоторых моих кодах.

0 голосов
/ 16 марта 2019

Я нашел возможный обходной путь, используя указатель на начало списка инициализатора и запрашивая его размер во время компиляции: массив constexpr и std :: initializer_list . Этот код компилируется на вышеупомянутом компиляторе, и я могу использовать size () и operator [] во время выполнения для получения информации из массива.

...