在编译时通过 constexpr 或模板函数获取多维 std::array 的大小

2024-04-16

我用的是三维std::array,因为大小在编译时已知。但是,我注意到 size() 函数不是静态的,因此 constexpr/模板函数无法访问。

我已经找到了下面的演示示例,它估计一维的大小std::array。然而,这不适用于二维或更多维度。有没有办法通过编写带有附加模板参数的函数来返回其他维度dim为了x, y, z, ..方面?

// Example program
#include <iostream>
#include <string>
#include <array>

// typedefs for certain container classes
template<class T, size_t x>
using array1D = std::array<T, x>;
template<class T, size_t x, size_t y>
using array2D = std::array<std::array<T, y>, x>;
template<class T, size_t x, size_t y, size_t z>
using array3D = std::array<std::array<std::array<T, z>, y>, x>;


template<class T, std::size_t N>
auto array_size_helper(const array1D<T, N>&) -> std::integral_constant<std::size_t, N>;

template<class Array>
using array_size = decltype(array_size_helper(std::declval<const Array&>()));

template<class Array>
constexpr auto static_size() -> decltype(array_size<Array>::value) {
  return array_size<Array>::value;
}
template<class Array>
constexpr auto static_size(Array const&) -> decltype(static_size<Array>()) {
  return static_size<Array>();
}

int main()
{
    std::cout << static_size<array3D<float, 3, 4, 5>>();
}

对于一维情况,您可以使用std::tuple_size其定义为std::array还有:

int main()
{
    std::cout << std::tuple_size<array3D<float, 3, 4, 5>>();
}

针对你的实际问题。如果我理解正确的话,您希望在尺寸函数上有一个附加参数,您可以使用它来选择应返回尺寸的尺寸,对吧?

这可以通过使用递归轻松完成。这是一个工作示例:

// Example program
#include <iostream>
#include <string>
#include <array>

// typedefs for certain container classes
template<class T, size_t x>
using array1D = std::array<T, x>;

template<class T, size_t x, size_t y>
using array2D = std::array<std::array<T, y>, x>;

template<class T, size_t x, size_t y, size_t z>
using array3D = std::array<std::array<std::array<T, z>, y>, x>;


template <size_t dim, typename Array>
struct size_of_dim;

// specialization for std array and first dimension
template <typename T, size_t N>
struct size_of_dim<0, std::array<T,N>> : std::integral_constant<size_t, N> {};

// specialization for std array and dimension > 0 → recurse down in dim
template <size_t dim, typename InnerArray, size_t N>
struct size_of_dim<dim, std::array<InnerArray,N>> : size_of_dim<dim-1,InnerArray> {};



int main()
{
    std::cout << size_of_dim<0,array3D<float, 3, 4, 5>>() << std::endl;
    std::cout << size_of_dim<1,array3D<float, 3, 4, 5>>() << std::endl;
    std::cout << size_of_dim<2,array3D<float, 3, 4, 5>>() << std::endl;
}

DEMO https://wandbox.org/permlink/0z8g3ccE8ac6uwOw

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在编译时通过 constexpr 或模板函数获取多维 std::array 的大小 的相关文章

  • EventHandler 应该始终用于事件吗?

    我一直在愉快地使用自定义委托类型和通用编写事件Action委托类型 没有真正考虑我在做什么 我有一些很好的扩展助手Action and EventHandler这使我倾向于使用那些预定义的委托类型而不是我自己的委托类型 但除此之外 除了惯例
  • 从另一个 FORM 中取回隐藏的 FORM

    我有两种形式Form1 and Form2 我正在打开Form2 from Form1 on button Click Form2 obj2 new Form2 this Visible false obj2 Show 然后我想回来Form
  • 使用 Xamarin.Forms 和 Zxing 生成 QR 码

    我在网上看到了很多关于这个的内容 旧帖子 但似乎没有什么对我有用 我正在尝试从字符串中生成二维码并将其显示在应用程序中 这就是我一开始的情况 qrCode new ZXingBarcodeImageView BarcodeFormat Ba
  • OpenGL缓冲区更新[重复]

    这个问题在这里已经有答案了 目前我正在编写一个模拟水的程序 以下是我所做的步骤 创建水面 平面 创建VAO 创建顶点缓冲区对象 在其中存储法线和顶点 将指针绑定到此 VBO 创建索引缓冲区对象 然后我使用 glDrawElements 渲染
  • .pdbs 会减慢发布应用程序的速度吗?

    如果 dll 中包含 pdb 程序调试 文件 则行号将出现在引发的任何异常的堆栈跟踪中 这会影响应用程序的性能吗 这个问题与发布与调试 即优化 无关 这是关于拥有 pdb 文件的性能影响 每次抛出异常时都会读取 pdb 文件吗 加载程序集时
  • C++中的类要具备什么条件才能成为容器?

    我是 C 编程新手 偶然发现了这个术语containers举例如下vector deque map etc 一个企业的最低要求应该是什么class应该满足被称为container in C 我将从 范围 这个概念开始 Range 只有两个方
  • 如何查明 .exe 是否正在 C++ 中运行?

    给定进程名称 例如 程序 exe C 标准库没有这样的支持 您需要一个操作系统 API 来执行此操作 如果这是 Windows 那么您将使用 CreateToolhelp32Snapshot 然后使用 Process32First 和 Pr
  • DataGridView 列中的数字文本框

    我有一个DataGridView 我想要它的第一列或任何所需的列 其中有textboxes在其中 成为NUMERIC ONLY 我目前正在使用这段代码 private void dataGridViewItems EditingContro
  • Nhibernate:连接表并从其他表获取单列

    我有以下表格 create table Users Id uniqueidentifier primary key InfoId uniqueidentifier not null unique Password nvarchar 255
  • 判断串口是普通COM还是SPP

    我正在寻找一种方法来确定 COM 是标准 COM 还是 SPP COM 也称为 COM 设备的电缆替换蓝牙适配器 我有一个可以在 USB COM gt USB 和蓝牙下工作的设备 并且蓝牙接口可以与 SPP 一起工作 我目前正在使用Syst
  • C 类型命名约定,_t 或 ALLCAPS

    我一直想知道是否有任何命名约定 例如何时对类型使用全部大写以及何时追加 t 什么时候不使用任何东西 我知道当时 K R 发布了各种有关如何使用 C 的文档 但我找不到任何相关内容 在 C 标准库类型中 t看起来漂亮占主导地位 time t
  • 检测 TextBox 中的 Tab 键按下

    I am trying to detect the Tab key press in a TextBox I know that the Tab key does not trigger the KeyDown KeyUp or the K
  • 如何设置消息队列的所有者?

    System Messaging MessageQueue 类不提供设置队列所有权的方法 如何以编程方式设置 MSMQ 消息队列的所有者 简短的答案是 p invoke 对 windows api 函数的调用MQSetQueueSecuri
  • 如何在新窗口中打开图像或pdf文件?

    我有一个 gridview 它包含文件名和文件路径 图像和 pdf 格式文件 其中我使用了模板字段 在该字段下放置了 1 个图像按钮 单击该图像按钮 即 查看 按钮 时 我想在新窗口中打开所选文件 这是我的代码 protected void
  • 从点云检测平面集

    我有一组点云 我想测试3D房间中是否有角落 所以我想讨论一下我的方法 以及在速度方面是否有更好的方法 因为我想在手机上测试它 我将尝试使用霍夫变换来检测线 然后我将尝试查看是否有三条线相交 并且它们也形成了两个相交的平面 如果点云数据来自深
  • 在 C++ 代码 gdb 中回溯指针

    我在运行 C 应用程序时遇到段错误 在 gdb 中 它显示我的一个指针位置已损坏 但我在应用程序期间创建了 10 万个这样的对象指针 我怎样才能看到导致崩溃的一个 我可以在 bt 命令中执行任何操作来查看该指针的生命周期吗 谢谢 鲁奇 据我
  • 与 Entity Framework Core 2.0 的一对零关系

    我正在使用 C 和 NET Framework 4 7 将 Entity Framework 6 1 3 Code First 库迁移到 Entity Framework Core 我一直在用 Google 搜索 Entity Framew
  • Unity,c++ 本机插件字节数组不匹配

    在我的 C 本机插件中 我有一个调用 vector
  • 运行 xunit 测试时无法将输出打印到控制台窗口

    public class test2InAnotherProject private readonly ITestOutputHelper output public test2InAnotherProject ITestOutputHel
  • 如何知道 HTTP 请求标头值是否存在

    我确信这很简单 但是却让我感到厌烦 我在 Web 应用程序中使用了一个组件 它在 Web 请求期间通过添加标头 XYZComponent true 来标识自身 我遇到的问题是 如何在视图中检查此组件 以下内容不起作用 if Request

随机推荐

  • 编辑表时关闭 PyQt 事件循环

    我正在使用 PyQt 开发 GUI GUI 有一个 qListWidget 一个 qTableWidget 和一个用 Mayavi 实现的绘图 该列表指的是绘制的形状 例如圆柱体和圆锥体 当在列表中选择形状时 我希望将形状的属性加载到表中
  • 将 unicode 字符的十六进制序列解码为字符串的最佳方法

    解码字符串最免代码的方法是什么 xD0 xAD xD0 xBB xD0 xB5 xD0 xBA xD1 x82 xD1 x80 xD0 xBE xD0 xBD xD0 xBD xD0 xB0 xD1 x8F C 中的人类字符串 该十六进制字
  • carouFredSel 响应高度

    我使用 carouFredSel 时遇到响应式旋转木马的高度问题 因为图像是响应式的 并且轮播也设置为响应式的 它仍然将图像的最大高度添加到 div 中 当我的图像宽度为 740 高度为 960 时 它将图像大小调整为响应宽度以适合屏幕 图
  • 使用 pip 构建 pysha3 时出错?错误:pysha3 构建轮子失败

    当我尝试使用 pip install pysha3 进行安装时 出现错误 错误 无法为 pysha3 构建轮子 我已经安装了 Windows 构建工具 不幸的是我在谷歌上找不到太多帮助 我使用的是 Windows 11 这是日志 PS C
  • 是否有 Windows API 可以修改扩展名的文件类型关联?

    我正在寻找一种方法来以编程方式调整 Windows 系统上文件关联的细节 例如 针对特定文件类型的 打开 操作的 执行此操作的应用程序用户 设置 显然 我可以通过直接修改注册表来做到这一点 但如果有一个 API 我更愿意使用它 因为它可能更
  • 如何将 NSMutableArray 的元素转换为 NSString

    我有 1 个 NSMutableArray 我想转换数组中的任何数据将在 NSString 中 告诉我代码 Array 只是 NSMutableArray 类的对象 如果您只想要数组的元素 那么您可以尝试 ComponentsJoinedB
  • Eclipse Bug:未处理的事件循环异常没有更多句柄

    我使用 Swing 和 MigLayout 构建了一个 GUI 我在 Windows 7 Ultimate 上使用 Eclipse 4 2 2 64 位 每次我单击返回窗口编辑代码时 都会出现一个弹出窗口 然后提示我重新启动 Eclipse
  • 如何将 YAML 转换为 JSON? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找在 YAML 文件和 JSON 之间进行转换 这真的很难找到任何信息 如果不需要 Json NET 的功能 也可以直接使用 Se
  • 需要:Rikulo UXL 示例

    我想让一些 UXL 与 Dart 编辑器一起使用 我担心我感觉示例代码用户体验实验室概述 http docs rikulo org ui latest UXL Fundamentals UXL Overview html要么已经过时 要么缺
  • 龙卷风错误处理

    我希望能够处理输入错误 URL 时显示的更好的错误E g localhost 8000 AFDADSFDKFADS 我收到一条丑陋的 python 回溯消息 因为抛出了一个ornado web HTTPError 异常 我知道我可以使用正则
  • iOS 9+ 通用链接不适用于 Google 应用

    我工作的公司让我问以下问题 当在其他应用程序 原生 Apple 应用程序 Slack 等 中点击通用链接时 我们的应用程序会打开 但如果在任何 Google 应用程序 环聊 收件箱等 中点击相同链接 则不会直接打开通用链接通过我们的应用程序
  • 在 Visual Studio 2017 中删除垂直虚线缩进线

    我刚刚安装了 Visual Studio 2017 代码编辑器中出现了奇怪的垂直缩进标记 我怎样才能删除它们 附 我禁用了所有扩展 但这没有帮助 下面有一个选项Tools Options Text Editor called Show st
  • mvc3 路由设置为 id, id2 id3

    我有以下区域路线设置 context MapRoute Admin default3 Admin controller action id id2 id3 new action Index context MapRoute Admin de
  • capistrano,:db 角色,它的用途是什么?

    据我所知 卡皮斯特拉诺 db角色仅用于运行迁移 因此 在大多数情况下 它可能不应该实际上是运行数据库的服务器 为什么那里会有 ruby rails 堆栈 或者允许 ssh 登录 它只是您想要实际执行 Rails 迁移的任何服务器 并且只有标
  • 实现移动运动体

    Project 我正在制作一个简单的项目 其中我希望能够制作一个运动体并将其从 x 点移动到 y 点 创建运动体 似乎没有太多直接内容 我一直在关注一些关于实现运动体的不同教程 因为我找不到指定如何正确执行此操作的教程 Problem 这似
  • 如何使用数据列表比较并返回数据

    我是 Haskell 的新手 我正在努力寻找一种使用类成员变量来返回我正在寻找的成员变量的方法 我有这个数据 data Place Place name String north Float east Float rainfall Int
  • 奥尔森 时区 到 windows

    我需要在 Windows 中从奥尔森时区转换时区 使用PHP 我找到了这个http unicode org repos cldr trunk common supplemental windowsZones xml http unicode
  • 用于搜索 Google 云端硬盘的 Google Apps 脚本

    是否可以使用 Google Apps 脚本在 Google 云端硬盘中搜索文档和文件夹 谷歌已经取消了自己的文档 驱动器搜索小工具 因为它似乎依赖于 iGoogle 谷歌企业支持也承认了这一点 谢谢 我想你正在寻找搜索文件 https de
  • Unity使用Invoke在另一个脚本上调用方法

    我有两个脚本 其中一个重新启动场景 另一个是倒计时器 而不是在第一个脚本中调用重新启动场景方法 但是 它没有重新启动 即使没有错误 我也不明白为什么 重新启动场景的第一个脚本 using UnityEngine using UnityEng
  • 在编译时通过 constexpr 或模板函数获取多维 std::array 的大小

    我用的是三维std array 因为大小在编译时已知 但是 我注意到 size 函数不是静态的 因此 constexpr 模板函数无法访问 我已经找到了下面的演示示例 它估计一维的大小std array 然而 这不适用于二维或更多维度 有没