Як отримати кількість елементів у 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)це не повинно бути правдою.
NathanOliver

Тому що масив може бути введений деінде в іншому місці або переданий як аргумент шаблону.
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 () ?
Jesper Juhl

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.