Как получить количество элементов в 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)это правда.


Если у вас есть 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);

Разве обычный 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 был передан в качестве аргумента шаблона в функцию шаблона? Даже тогда единственная цель, которую я вижу, состоит в том, чтобы назначить его как возвращаемый объект, который все еще требует создания экземпляра.
Джем Тейлор
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.