C++ 使用构造函数参数初始化成员数组

2023-12-26

我有一个模板类,其中包含编译时常量长度的单个成员数组。我希望这个数组是常量,但根据构造函数提供的输入初始化它被证明很困难:

struct Input {
    int value;
};

template<size_t Size>
struct Foo {
    int const myVals[Size];
    Foo(std::array<Input, Size> const &in)
        : myVals{ in[0].value, in[1].value, /* How many times? */ } {
    }
}

由于我不知道数组的大小,因此我不知道要初始化多少个值myVals。以下代码有效,但我怀疑这是否是最好的方法:

template<size_t Size>
struct Foo {
    std::array<int, Size> const myVals;
    Foo(std::array<Input, Size> const &in)
        : myVals{ toIntArray(in) } {
    }
private:
    static std::array<int, Size> toIntArray(std::array<Input, Size> const &in) {
        std::array<int, Size> result;
        for (size_t i{ 0 }; i < Size; ++i) {
            result[i] = in[i].value;
        }
        return result;
    }
}

是否有更简洁或更普遍接受的方法来填充常量成员数组的值?


您可以使用std::index_sequence获取数组的索引作为非类型模板参数包。然后就可以使用参数包扩展了。

template<size_t Size>
struct Foo {
    int const myVals[Size];
    Foo(std::array<Input, Size> const &in)
        : Foo(in, std::make_index_sequence<Size>()) { }
    private:
    template<size_t... Is>
    Foo(std::array<Input, Size> const &in, std::index_sequence<Is...>)
        : myVals{in[Is].value...} { }
}

使用辅助模板size_t... Is包和一个std::index_sequence<Is...>参数是处理固定大小可索引容器的常见模式。这index_sequence实际上什么也没做;它只是一个代理,因此Is可以推导出模板参数。例如。如果你检查Godbolt https://www.godbolt.org/#g:!((g:!((g:!((h:codeEditor,i:(j:1,lang:c%2B%2B,source:'%23include+%3Carray%3E%0A%0Astruct+Input+%7B%0A++++int+value%3B%0A%7D%3B%0A%0Atemplate%3Csize_t+Size%3E%0Astruct+Foo+%7B%0A++++int+const+myVals%5BSize%5D%3B%0A++++Foo(std::array%3CInput,+Size%3E+const+%26in)%0A++++++++:+Foo(in,+std::make_index_sequence%3CSize%3E())+%7B+%7D%0A++++private:%0A++++template%3Csize_t...+Is%3E%0A++++Foo(std::array%3CInput,+Size%3E+const+%26in,+std::index_sequence%3CIs...%3E)%0A++++++++:+myVals%7Bin%5BIs%5D.value...%7D+%7B+%7D%0A%7D%3B%0A%0Aint+main()+%7B%0A++++Foo%3C2%3E+f(std::array%3CInput,+2%3E%7B%7B%7B1%7D,+%7B2%7D%7D%7D)%3B%0A%7D'),l:'5',n:'0',o:'C%2B%2B+source+%231',t:'0')),k:54.29831006612784,l:'4',n:'0',o:'',s:0,t:'0'),(g:!((h:compiler,i:(compiler:clang800,filters:(b:'0',binary:'1',commentOnly:'0',demangle:'0',directives:'0',execute:'1',intel:'0',libraryCode:'1',trim:'1'),fontScale:1.0749542399999998,lang:c%2B%2B,libs:!(),options:'-std%3Dc%2B%2B2a+-Wall+-O1',source:1),l:'5',n:'0',o:'x86-64+clang+8.0.0+(Editor+%231,+Compiler+%231)+C%2B%2B',t:'0')),k:45.70168993387216,l:'4',n:'0',o:'',s:0,t:'0')),l:'2',n:'0',o:'',t:'0')),version:4它似乎完全蒸发了-O1.

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

C++ 使用构造函数参数初始化成员数组 的相关文章

  • 将字节数组转换为托管结构

    更新 这个问题的答案帮助我编写了开源项目GitHub 上的 AlicanC 现代战争 2 工具 https github com AlicanC AlicanC s Modern Warfare 2 Tool 你可以看到我是如何阅读这些数据
  • C 程序从连接到系统的 USB 设备读取数据

    我正在尝试从连接到系统 USB 端口的 USB 设备 例如随身碟 获取数据 在这里 我可以打开设备文件并读取一些随机原始数据 但我想获取像 minicom teraterm 这样的数据 请让我知道我可以使用哪些方法和库来成功完成此操作以及如
  • SSL/TLS/HTTPS 站点在 C#/.NET WebBrowser 控件中非常慢,但在 Internet Explorer 中则很好

    背景 我正在修改自动维基浏览器 http en wikipedia org wiki Wikipedia AutoWikiBrowser使用托管在安全服务器上的 MediaWiki 站点 我允许用户通过 C 应用程序中的 WebBrowse
  • 如何尝试/捕获所有异常

    我正在完成由其他人启动的 UWP 应用程序 该应用程序经常崩溃 我总是陷入困境应用程序 at if global System Diagnostics Debugger IsAttached global System Diagnostic
  • C# 正则表达式用于查找 中具有特定结尾的链接

    我需要一个正则表达式模式来查找字符串 带有 HTML 代码 中的链接 以获取文件结尾如 gif 或 png 的链接 示例字符串 a href site com folder picture png target blank picture
  • CultureInfo 的实例(来自相同的文化)根据操作系统而变化

    我有一个网站 上面写着这样的日期 CultureInfo cultureInfo CultureInfo GetCultures CultureTypes AllCultures FirstOrDefault c gt string Equ
  • 从 C 结构生成 C# 结构

    我有几十个 C 结构 我需要在 C 中使用它们 典型的 C 结构如下所示 typedef struct UM EVENT ULONG32 Id ULONG32 Orgin ULONG32 OperationType ULONG32 Size
  • 如何创建用于 QML 的通用对象模型?

    我想知道是否有任何宏或方法如何将 Qt 模型注册为 QObject 的属性 例如 我有AnimalModel http doc qt io qt 5 qtquick modelviewsdata cppmodels html qabstra
  • 如何使用MySqlCommand和prepare语句进行多行插入?(#C)

    Mysql 给出了如何使用准备语句和 NET 插入行的示例 http dev mysql com doc refman 5 5 en connector net programming prepared html http dev mysq
  • 将字符串转换为正确的 URI 格式?

    有没有简单的方法可以将电子邮件地址字符串转换为正确的 URI 格式 Input http mywebsite com validate email 3DE4ED727750215D957F8A1E4B117C38E7250C33 email
  • 对 boost 库的依赖项没有完整路径

    我已经成功构建了动态库 依赖于使用自定义前缀构建和安装的 boost 库 b2 install prefix PREFIX 然而 当我跑步时otool L在我的库中 我得到如下输出 libboost regex dylib compatib
  • HttpWebRequest vs Webclient(特殊场景)

    我知道这个问题之前已经回答过thread https stackoverflow com questions 1694388 webclient vs httpwebrequest httpwebresponse 但我似乎找不到详细信息 在
  • C# 委托责任链

    为了我的理解目的 我实现了责任链模式 Abstract Base Type public abstract class CustomerServiceDesk protected CustomerServiceDesk nextHandle
  • 为什么具有相同名称但不同签名的多个继承函数不会被视为重载函数?

    以下代码片段在编译期间产生 对 foo 的调用不明确 错误 我想知道是否有任何方法可以解决此问题而不完全限定对 foo 的调用 include
  • C++11 动态线程池

    最近 我一直在尝试寻找一个用于线程并发任务的库 理想情况下 是一个在线程上调用函数的简单接口 任何时候都有 n 个线程 有些线程比其他线程完成得更快 并且到达的时间不同 首先我尝试了 Rx 它在 C 中非常棒 我还研究了 Blocks 和
  • 二叉树中的 BFS

    我正在尝试编写二叉树中广度优先搜索的代码 我已将所有数据存储在队列中 但我不知道如何访问所有节点并消耗它们的所有子节点 这是我的 C 代码 void breadthFirstSearch btree bt queue q if bt NUL
  • 从 R 到 C 处理列表并访问它

    我想使用从 R 获得的 C 列表 我意识到这个问题与此非常相似 使用 call 在 R 和 C 之间传递数据帧 https stackoverflow com questions 6658168 passing a data frame f
  • WPF。如何从另一个窗口隐藏/显示主窗口

    我有两个窗口 MainWindow 和 Login 显示登录的按钮位于主窗口 this Hide Login li new Login li Show 登录窗口上有一个检查密码的按钮 如果密码正确 我如何显示主窗口 将参数传递给 MainW
  • 从 Delphi 调用 C# dll

    我用单一方法编写了 Net 3 5 dll 由Delphi exe调用 不幸的是它不起作用 步骤 1 使用以下代码创建 C 3 5 dll public class MyDllClass public static int MyDllMet
  • 带有私有设置器的 EFCore Base 实体模型属性 - 迁移奇怪的行为

    实体模型继承的类内的私有设置器似乎会导致 EFCore 迁移出现奇怪的问题 考虑以下示例 其中有多个类 Bar and Baz 继承自Foo 跑步时Add Migration多次命令 添加 删除private修饰符 生成的模式在多个方面都是

随机推荐

  • 获取我的 RAM 的制造商名称(WMI 未获取此信息)

    我需要获取有关 RAM 模块的完整信息 我尝试使用 WMI 来获取它 ManagementObjectSearcher searcher12 new ManagementObjectSearcher root CIMV2 SELECT FR
  • linux/unix 下是否有与 WinAPI 的 MAX_PATH 等效的东西?

    如果我想分配一个保证足够大以容纳任何有效的绝对路径 文件名的字符数组 在C中 那么它需要有多大 在 Win32 上 有 MAX PATH 定义 Unix linux 的等价物是什么 有一个PATH MAX 但是有点问题 来自错误部分真实路径
  • UIAutomation:在没有实际执行的情况下点击警报视图上的取消按钮

    我在 UIAutomation 中面临这个奇怪的问题 我正在检查警报 在其中 我试图记录警报标题和警报消息 我的代码是 UIATarget onAlert function onAlert alert UIALogger logMessag
  • 将文本文件写入 blob 时无法保留换行符

    我有一个文本区域 其中包含我想要输出到文本文件以供用户下载的文本 当用户单击 保存 按钮时 我使用此功能来获取它 function saveTextAsFile var textToWrite document getElementById
  • NodeJS 中的提示模块重复输入

    我正在使用 NodeJS 及其 CLI 应用程序创建一个应用程序 为了获取用户的输入 我使用 提示 模块 我可以使用它 但是在输入提示符时 每个字符都会重复 但是输出很好 代码如下 请帮忙 prompt start prompt get p
  • 使用身份主键将新实体插入到上下文中

    我想将一条新记录插入到我的 SQL 表中 我试过 public void CreateComment int questionId string comment QuestionComment questionComment context
  • 如何删除Github上和本地的最后n次提交?

    我正在尝试从我的 GitHub 存储库之一删除最后 2 次提交 我已经按照建议尝试了here https stackoverflow com questions 448919 how can i remove a commit on git
  • Yesod、WebSockets 和持久性

    我正在尝试在 Haskell 中实现一个基于回合的游戏的服务器 我的选择是使用 Yesod 进行管理和元信息 例如 用户参与哪些游戏等 我想使用网络套接字来保持游戏内数据开销较小 看看 ws chat 示例 我不确定如何访问 Handler
  • lockCanvas 不断抛出异常

    我从 opencv4android 人脸检测 复制了示例代码 我通过了NDK部分 并在手机上运行该应用程序 然而 SurfaceView 仅显示相机预览 看来 OnCameraFrame 中所做的任何操作都不会影响 SurfaceView
  • C# - 使用反射比较两个 .net dll

    我想比较位于不同位置的两个相同的 net dll 因此 我使用加载 dllSystem Reflection Assembly LoadFile filename 代替System Reflection Assembly LoadFrom
  • Pod 文件中的“平台”指的是什么?

    当你在顶部创建一个新的 pod 文件时 会有 platform ios 9 0 我应该将此 平台 值设置为我的项目的部署目标吗 它指定您要支持 pod 项目的最低操作系统版本 如果您的应用程序项目的部署目标低于提到的 pod 项目的 iOS
  • ThreadPoolExecutor:: 来自执行器的 TaskRejectedException

    我的应用程序正在通过 Jms MessageListener 类读取消息 并且在某个时间点它会抛出异常任务拒绝异常 我知道你们大多数人都会说线程数超出了最大池大小而且队列也满了 但我观察到一些事情 发送到 MessageListener 类
  • 创建与数据库表同名的缓冲区

    我在很多地方都遇到过这段代码 DEFINE BUFFER Customer FOR Customer 我有两个问题 这样做的目的是什么 为什么创建与表同名的缓冲区是有益的 当编写代码访问该表 缓冲区时 Progress 如何知道是直接访问
  • Foreman 不使用 NGINX

    我正在尝试使用Foreman https github com ddollar foreman 版本 0 31 0 来管理我们应用程序的进程 但我对 nginx nginx 1 0 10 Phusion Passenger 3 0 11 的
  • 为什么 C 代码中的 1.0f 在生成的程序集中表示为 1065353216?

    在 C 中我有这个代码块 if x 1 a j i 1 else a j i 0 a是一个浮点值矩阵 如果我尝试以 nasm 语法查看此代码的编译程序集 线a j i 0 作业 以这种方式编码 dword rsi rdi 0 但这条线a j
  • Java 中箭头运算符“->”有什么作用?

    在搜索一些代码时 我遇到了箭头运算符 它到底是做什么的 我以为Java没有箭头运算符 return Collection
  • Entity Framework 5 的新迁移功能是否完全支持枚举更改?

    假设我们有以下简单模型 public class Car public int Year get set public string Make get set public string Model get set public CarTy
  • 如何编辑 jquery 函数

    我正在尝试修改 jQuery V 6 1 核心中的 attr 函数 我有一个plugins js 文件 该文件包含在jquery 6 1 js 文件之后的页面中 plugins js 文件包含对各种 jQuery 核心函数的改进 以适应某些
  • Scrapy获取任何网站的所有链接

    我有以下 Python 3 网络爬虫代码 import requests from bs4 import BeautifulSoup import re def get links link return links r requests
  • C++ 使用构造函数参数初始化成员数组

    我有一个模板类 其中包含编译时常量长度的单个成员数组 我希望这个数组是常量 但根据构造函数提供的输入初始化它被证明很困难 struct Input int value template