Как получить количество элементов в std :: array <T, N>, не создавая его экземпляр?

9

Есть std::array<T, N>::size(), но это не статично, поэтому требуется экземпляр std::array. Есть ли способ получить значение, которое он возвращает (который является Nиз std::array<T, N>) без необходимости создания экземпляра массива? Для обычного массива я мог бы использовать sizeof, но не вижу никакой гарантии, что sizeof(std::array<T, N>) == N * sizeof(T)это правда.

dragonroot
источник
Если у вас есть N, почему вы должны попросить arrayвоспроизвести это для вас?
ShadowRanger
@ShadowRanger Потому sizeof(std::array<T, N>) == N * sizeof(T)что не должно быть правдой.
Натан Оливер
Потому что массив может быть определен в другом месте или передан в качестве аргумента в шаблон.
dragonroot
1
Если вы хотите узнать количество элементов, просто используйте N.
JohnFilleau
1
@dragonroot Какой смысл всего этого, хотя? Если вам уже нужно Nначать, нет необходимости проходить через все это, чтобы получить Nкосвенные данные или подтвердить это N==N. Какой конкретный вариант использования вы пытаетесь решить?
Реми Лебо

Ответы:

14

Там же std::tuple_size<std::array>.

static_assert(std::tuple_size<std::array<int, 5>>::value == 5);
0x499602D2
источник
Разве обычный std :: size () не подойдет?
Джеспер Юл
2
@JesperJuhl На самом деле нет, std::size()требуется экземпляр массива.
0x499602D2
1
Однако использовать его не имеет смысла tuple_size, если вы уже знаете размер массива заранее, чтобы передать его в шаблон. Может быть, это был бы более значимый пример? using ArrayType = std::array<int, 5>; ... static_assert(std::tuple_size<ArrayType>::value == 5);
Реми Лебо
@RemyLebeau Я думаю, что O / P думает, что массив decl был передан в качестве аргумента шаблона в функцию шаблона? Даже тогда единственная цель, которую я вижу, состоит в том, чтобы назначить его как возвращаемый объект, который все еще требует создания экземпляра.
Джем Тейлор