Typedef 二维数组的大小
Size of a Typedef'd 2-Dimensional Array
给定一个类型定义的二维数组:
typedef float Matrix3x3[3][3];
如果我想获得 Matrix3x3
中 float
的总数,我觉得我应该可以这样做:
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
的解决方案。
给定一个类型定义的二维数组:
typedef float Matrix3x3[3][3];
如果我想获得 Matrix3x3
中 float
的总数,我觉得我应该可以这样做:
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
的解决方案。