Typedef 二维数组的大小

Size of a Typedef'd 2-Dimensional Array

给定一个类型定义的二维数组:

typedef float Matrix3x3[3][3];

如果我想获得 Matrix3x3float 的总数,我觉得我应该可以这样做:

sizeof(Matrix3x3) / sizeof(**Matrix3x3)

但显然我不能解除对类型的引用。最好的方法是什么?

首先,你要除法,而不是乘法。其次,习惯的方式是

auto n_elements = sizeof(Matrix3x3) / sizeof(std::declval<Matrix3x3>()[0][0]);

这给出了 9 的期望值。

您可以使用 std::remove_all_extents.

sizeof(Matrix3x3) / sizeof(std::remove_all_extents_t<Matrix3x3>)

无论有多少维,它都是从数组类型中删除所有方括号的特征。

您可以使用:

sizeof(Matrix3x3)/sizeof(float)

因为它是 C++ 而不是 C,我会写一个合适的类型特征:

#include <cstddef>
#include <type_traits>

template <typename T>
inline constexpr std::size_t total_extent_v = 1;

template <typename T, std::size_t N>
inline constexpr std::size_t total_extent_v<T[N]> = N * total_extent_v<T>;

用法:

std::cout << total_extent_v<Matrix3x3> << '\n';

如果这太多了,而你想要更简单的东西,我会使用@StoryTeller 建议的基于 std::remove_all_extents_t 的解决方案。