如何找到多维std::array的大小?

How to find size of multidimensional std::array?

我有一个多维的 std::array 并正在寻找合适的(方便和有效的)方法来找到它的 大小(以单元格数或字节数计)

size()returns只有最后一个尺寸大小(理解为)

std::array<std::array<std::array<std::array<double, 2>, 3>, 6>, 100> my_array;

my_array.size();  // returns 100

虽然数组的大小在编译时是已知的,但我希望避免使用 #define SIZE_OF_MY_ARRAY 或全局变量,因为我正在寻找一种比使用数组传递大小更好的方法(如 "old" arrays, not std array), or informing others to use the defined term.

我也比较喜欢no每次都计算

也许这两个首选项对于多维数组是不可能的?

如何有效地找到 my_array 的整体大小?我正在使用 .

您可以使用 constexpr 绑定到维度的变量,然后使用这些变量计算所需的数量。

constexpr int n1 = 2;
constexpr int n2 = 3;
constexpr int n3 = 6;
constexpr int n4 = 100;

std::array<std::array<std::array<std::array<double, n1>, n2>, n3>, n4> my_array;

constexpr int myArraySize = n1*n2*n3*n4;

怎么样

sizeof(my_array)/sizeof(double);

编写一个在编译时计算这个的小实用程序并不难。

template<typename T> struct arr_sz {
    static constexpr std::size_t size = sizeof(T);
};

template<typename T, std::size_t N>
struct arr_sz<std::array<T, N>> {
    static constexpr std::size_t size = N * arr_sz<T>::size;
};

上面应该解开任何实际深度的嵌套数组定义,并评估用于存储 T 的字节大小,排除所有可能的填充。

使用它的一个例子是

std::array<std::array<std::array<std::array<double, 2>, 3>, 6>, 100> my_array;
constexpr auto sz = arr_sz<decltype(my_array)>::size;
static_assert(sz == sizeof(double) * 2 * 3 * 6 * 100, ""); 

你可能会看到 live

您可以使用递归来计算它的大小:

template<typename T>
size_t get_array_full_size(T &val) { // for the last array type (double in this case)
    return 1;
}

template<typename T, size_t Len>
size_t get_array_full_size(std::array<T, Len> &arr) {
    return get_array_full_size(arr[0]) * arr.size();
}

int main() {
    std::array<std::array<std::array<std::array<double, 2>, 3>, 6>, 100> my_array;
    std::cout << get_array_full_size(my_array) << std::endl;
    return 0;
}

类似于 @KorelK 的方法。递归模板函数将停止时 class std::array is primitive type 的模板。

(See online)

#include <array>
#include <type_traits> // std::is_fundamental_v

template<typename Type, std::size_t N>
std::size_t overall_size(const std::array<Type, N>&)
{
    if constexpr(std::is_fundamental_v<Type>)   return N;
    else return N * overall_size(Type{});
}