Ответ 1
Вы можете использовать std::tuple_size
:
std::tuple_size<decltype(Foo::bar)>::value
С учетом этой структуры:
struct Foo {
std::array<int, 8> bar;
};
Как я могу получить количество элементов массива bar
, если у меня нет экземпляра Foo
?
Вы можете использовать std::tuple_size
:
std::tuple_size<decltype(Foo::bar)>::value
Несмотря на хороший ответ @Jarod42, вот еще одно возможное решение на основе decltype
, которое не использует tuple_size
.
Это следует за минимальным рабочим примером, который работает в С++ 11:
#include<array>
struct Foo {
std::array<int, 8> bar;
};
int main() {
constexpr std::size_t N = decltype(Foo::bar){}.size();
static_assert(N == 8, "!");
}
std::array
уже имеет функцию constexpr member с именем size
, которая возвращает значение, которое вы ищете.
Вы можете дать член Foo
a public static constexpr
.
struct Foo {
static constexpr std::size_t bar_size = 8;
std::array<int, bar_size> bar;
}
Теперь вы знаете размер бара от Foo::bar_size
, и у вас есть дополнительная гибкость присвоения имени bar_size
чему-то более описательному, если Foo
когда-либо имеет несколько массивов одинакового размера.
Вы можете сделать это так же, как для устаревших массивов:
sizeof(Foo::bar) / sizeof(Foo::bar[0])
Использование:
sizeof(Foo::bar) / sizeof(int)
Вы можете использовать как:
sizeof Foo().bar