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++ 使用构造函数参数初始化成员数组 的相关文章

  • 调用 McAfee 病毒扫描引擎

    我收到客户的请求 要求使用他们服务器上的 McAfee 病毒扫描将病毒扫描集成到应用程序中 我做了一些调查 发现 McScan32 dll 是主要的扫描引擎 它导出各种看起来有用的函数 我还发现提到了 McAfee Scan Engine
  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • C# 异步等待澄清?

    我读了here http blog stephencleary com 2012 02 async and await html that 等待检查等待的看看它是否有already完全的 如果 可等待已经完成 那么该方法将继续 运行 同步
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • 在 NumPy 中获取 ndarray 的索引和值

    我有一个 ndarrayA任意维数N 我想创建一个数组B元组 数组或列表 其中第一个N每个元组中的元素是索引 最后一个元素是该索引的值A 例如 A array 1 2 3 4 5 6 Then B 0 0 1 0 1 2 0 2 3 1 0
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • 在 Unity 中实现 Fur with Shells 技术

    我正在尝试在 Unity 中实现皮毛贝壳技术 http developer download nvidia com SDK 10 5 direct3d Source Fur doc FurShellsAndFins pdf Fins 技术被
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • Fortran 子例程返回错误值

    嘿 我正在开发一个 Fortran 程序 遇到了一个奇怪的问题 当我尝试在调用特定子例程之前直接输出数组的某些值时 我得到了正确的值 然后 我尝试在启动子例程时输出同一数组的一些值 它们都是 0 我最终在子例程之后输出数组的值 并且这些值回
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • 类型或命名空间“MyNamespace”不存在等

    我有通常的类型或命名空间名称不存在错误 除了我引用了程序集 using 语句没有显示为不正确 并且我引用的类是公共的 事实上 我在不同的解决方案中引用并使用相同的程序集来执行相同的操作 并且效果很好 顺便说一句 这是VS2010 有人有什么

随机推荐

  • 获取我的 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