c++ - 如何找到多维 std::array 的大小?
问题描述
我有一个多维std::array
并寻找正确(方便和有效)的方法来找到它的大小(以单元格数或字节数)
size()
只返回最后一个维度大小(这是可以理解的)
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
使用全局变量,因为我正在寻找一种比使用数组传递大小更好的方法(如在“旧”数组中,而不是 std 数组中),或者通知其他人使用定义的术语。
我也不想每次都计算它。
也许这两个偏好对于多维数组是不可能的?
我怎样才能有效地找到整体大小my_array
?我正在使用c++11。
解决方案
编写一个在编译时计算它的小实用程序并不难。
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
's 的字节大小,排除所有潜在的填充。
使用它的一个例子是
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, "");
你可能会看到现场。
推荐阅读
- mongodb - MongoDb:直接查询不起作用
- java - JBoss EAP6 - 无法创建 JDBC 数据源 (Microsoft SQL Server)
- c# - 如何通过单击 C# 中的按钮来隐藏和显示面板
- marklogic - 如何避免在尝试获取开发人员许可证时出错?
- javascript - 将多个参数从子道具传递给父方法
- sorting - 根据长度对Jinja2中的列表进行排序
- sql-server - 为什么创建非聚集索引会减慢数据检索速度?
- ruby-on-rails - 从参数创建新哈希的方法是什么?
- sql-server - 如何使用 SSIS 将 OTM 中的数据提取到 SQL Server 中?
- mysql - 将 tls1.2 与 python 3.5 和 mysql 服务器一起使用