c/c++将tuple展开/解包到不定参数列表中

2023-10-28

问题引入

现在想实现这样一个模板类,将不定参通过commit函数提交到工作队列,然后由一个线程从队列中取出数据,调用process方法对输入进行处理。如下面的类所定义。

template<class ...Args>
class AsyncProcess {
public:
    virtual void commit(Args...args) {
        jobQueue.emplace(make_tuple(args));
    };

protected:
    struct Job {
        tuple<Args...> args;
    };

    queue<Job> jobQueue;

    virtual void process(Args...args) = 0;
};

但是遇到一个问题,我们用tuple保存不定参数在队列中进行传输,但是我们没用一个通用的办法直接将tuple里面的值一一传递到process的不定参数列表中。
正常的,我们要将数组的值赋值到不定参数列表中,可以使用std::get方法,如下所示:

template<class ...Args>
void process(Args...) {

}

void callProcess(tuple<int, int, float> tp) {
    process(get<0>(tp), get<1>(tp), get<2>(tp));
}

问题提出

那么问题来了,对于不定参数,我们无法知道我们需要调用多少次std::get才能将tuple内的值全部取出,赋值到不定参数列表中。

引入templete< size_t…Is >模板

为了解决上面问题,我们需要知道展开不定参数模板一个特性,下面这段代码中,我们调用了callProcess<0, 1, 2>,则get<Is>(tp)...实际会被展开为get<0>(tp), get<1>(tp), get<2>(tp),这似乎里我们解决问题又进了一大步,但是我们要如何获取<0,1,2,3…>,也就是不定参数模板的索引呢?

template<size_t ...Is>
void callProcess(tuple<int, int, float> tp) {
    process(get<Is>(tp)...);
}

int main() {
    callProcess<0, 1, 2>(make_tuple(1, 1, 2.f));
}

获取不定参数模板的索引模板

下面的代码为我们提供了获取不定参数索引模板的方法,我们调用callProcess的时候就能将tuple自动展开到process方法的参数列表中。

template<class ...Args>
class Tmp {
    template<size_t...>
    struct tuple_idx {
    };

    template<size_t N, size_t... Is>
    struct tuple_bind : tuple_bind<N - 1, N - 1, Is...> {
    };

    template<size_t... Is>
    struct tuple_bind<0, Is...> {
        typedef tuple_idx<Is...> type;
    };

public:
    virtual void process(Args... args) = 0;

    template<size_t...Is>
    void extendTupleToProcess(tuple<Args...> t, tuple_idx<Is...> &&) {
        process(get<Is>(t)...);
    }

    void callProcess(tuple<Args...> t) {
        extendTupleToProcess(t, typename tuple_bind<sizeof ...(Args)>::type());
    }
};

其原理如下:
我们定义tuple_bind<3>的时候,实际创建了这样一个模板
tuple_bind<3>:tuple_bind<2,2>:tuple_bind<1,1,2>:tuple_bind<0,0,1,2>,这时候,tuple_bind<0, Is...>的Is就会被解释为<0,1,2>,也就是我们想要的。
那么如何取出Is呢?我们在tuple_bind<0, Is...>内部定义了typedef tuple_idx<Is...> type;,因此我们只要向extendTupleToProcess方法中传入一个tuple_idx<Is...>就能将template<size_t...Is> void extendTupleToProcess的Is定义为我们想要的结果,从而用于展开tuple。

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

c/c++将tuple展开/解包到不定参数列表中 的相关文章

  • 检查两个数是否是彼此的排列?

    给定两个数字 a b 使得 1 例如 123 是 312 的有效排列 我也不想对数字中的数字进行排序 如果您指的是数字的字符 例如 1927 和 9721 则 至少 有几种方法 如果允许排序 一种方法是简单地sprintf将它们放入两个缓冲
  • 访问私人成员[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 通过将类的私有成员转换为 void 指针 然后转换为结构来访问类的私有成员是否合适 我认为我无权修改包含我需要访问的数据成员的类 如果不道德 我
  • 将数组向左或向右旋转一定数量的位置,复杂度为 o(n)

    我想编写一个程序 根据用户的输入 正 gt 负 include
  • pthread_cond_timedwait() 和 pthread_cond_broadcast() 解释

    因此 我在堆栈溢出和其他资源上进行了大量搜索 但我无法理解有关上述函数的一些内容 具体来说 1 当pthread cond timedwait 因为定时器值用完而返回时 它如何自动重新获取互斥锁 互斥锁可能被锁定在其他地方 例如 在生产者
  • 如何在列表框项目之间画一条线

    我希望能够用水平线分隔列表框中的每个项目 这只是我用于绘制项目的一些代码 private void symptomsList DrawItem object sender System Windows Forms DrawItemEvent
  • 实时服务器上的 woff 字体 MIME 类型错误

    我有一个 asp net MVC 4 网站 我在其中使用 woff 字体 在 VS IIS 上运行时一切正常 然而 当我将 pate 上传到 1and1 托管 实时服务器 时 我得到以下信息 网络错误 404 未找到 http www co
  • 当 contains() 工作正常时,xpath 函数ends-with() 工作时出现问题

    我正在尝试获取具有以特定 id 结尾的属性的标签 like span 我想获取 id 以 国家 地区 结尾的跨度我尝试以下xpath span ends with id Country 但我得到以下异常 需要命名空间管理器或 XsltCon
  • 指针问题(仅在发布版本中)

    不确定如何描述这一点 但我在这里 由于某种原因 当尝试创建我的游戏的发布版本进行测试时 它的敌人创建方面不起作用 Enemies e level1 3 e level1 0 Enemies sdlLib 500 2 3 128 250 32
  • 如何将图像和 POST 数据上传到 Azure 移动服务 ApiController 终结点?

    我正在尝试上传图片and POST表单数据 尽管理想情况下我希望它是json 到我的端点Azure 移动服务应用 我有ApiController method HttpPost Route api upload databaseId sea
  • 将目录压缩为单个文件的方法有哪些

    不知道怎么问 所以我会解释一下情况 我需要存储一些压缩文件 最初的想法是创建一个文件夹并存储所需数量的压缩文件 并创建一个文件来保存有关每个压缩文件的数据 但是 我不被允许创建许多文件 只能有一个 我决定创建一个压缩文件 其中包含有关进一步
  • Cython 和类的构造函数

    我对 Cython 使用默认构造函数有疑问 我的 C 类 Node 如下 Node h class Node public Node std cerr lt lt calling no arg constructor lt lt std e
  • WPF TabControl,用C#代码更改TabItem的背景颜色

    嗨 我认为这是一个初学者的问题 我搜索了所有相关问题 但所有这些都由 xaml 回答 但是 我需要的是后台代码 我有一个 TabControl 我需要设置其项目的背景颜色 我需要在选择 取消选择和悬停时为项目设置不同的颜色 非常感谢你的帮助
  • 指针减法混乱

    当我们从另一个指针中减去一个指针时 差值不等于它们相距多少字节 而是等于它们相距多少个整数 如果指向整数 为什么这样 这个想法是你指向内存块 06 07 08 09 10 11 mem 18 24 17 53 7 14 data 如果你有i
  • C# 中的递归自定义配置

    我正在尝试创建一个遵循以下递归结构的自定义配置部分
  • 在数据库中搜索时忽略空文本框

    此代码能够搜索数据并将其加载到DataGridView基于搜索表单文本框中提供的值 如果我将任何文本框留空 则不会有搜索结果 因为 SQL 查询是用 AND 组合的 如何在搜索 从 SQL 查询或 C 代码 时忽略空文本框 private
  • Github Action 在运行可执行文件时卡住

    我正在尝试设置运行google tests on a C repository using Github Actions正在运行的Windows Latest 构建过程完成 但是当运行测试时 它被卡住并且不执行从生成的可执行文件Visual
  • for循环中计数器变量的范围是多少?

    我在 Visual Studio 2008 中收到以下错误 Error 1 A local variable named i cannot be declared in this scope because it would give a
  • 如何将单个 char 转换为 int [重复]

    这个问题在这里已经有答案了 我有一串数字 例如 123456789 我需要提取它们中的每一个以在计算中使用它们 我当然可以通过索引访问每个字符 但是如何将其转换为 int 我研究过 atoi 但它需要一个字符串作为参数 因此 我必须将每个字
  • 32 位到 64 位内联汇编移植

    我有一段 C 代码 在 GNU Linux 环境下用 g 编译 它加载一个函数指针 它如何执行并不重要 使用一些内联汇编将一些参数推送到堆栈上 然后调用该函数 代码如下 unsigned long stack 1 23 33 43 save
  • 为什么我收到“找不到编译动态表达式所需的一种或多种类型。”?

    我有一个已更新的项目 NET 3 5 MVC v2 到 NET 4 0 MVC v3 当我尝试使用或设置时编译出现错误 ViewBag Title财产 找不到编译动态表达式所需的一种或多种类型 您是否缺少对 Microsoft CSharp

随机推荐

  • Spring3学习笔记之(spring core之DI配置使用2)

    上一章节已经介绍了注入常量 集合等基本数据类型和集合数据类型 本小节将介绍注入依赖Bean及注入内部Bean 引用其他Bean的步骤与注入常量的步骤一样 可以通过构造器注入及setter注入引用其他Bean 只是引用其他Bean的注入配置稍
  • 5.6.1_浮点数的表示

    文章目录 一 引子 二 定点数的局限性 三 从科学计数法理解浮点数 1 十进制 2 二进制 1 定点数 2 浮点数 浮点数的表示 补充 练习 四 浮点数尾数的规格化 1 左规 1 十进制 2 二进制 2 右规 1 规则 2 例子 五 规格化
  • 手把手教你开发 clang 插件

    Clang是llvm的编译器前端 非常适合进行源码分析 目前开源的oclint就是基于clang进行的代码静态检查 工作中遇到了一些问题需要进行代码分析 所以学习了插件的开发流程 既然开发插件就要有合适的IDE Mac上最合适的无疑是xco
  • 在C语言中利用PCRE实现正则表达式

    http dev jizhiinfo net post 49 1 PCRE简介 PCRE Perl Compatible RegularExpressions即 perl语言兼容正则表达式 是一个用C语言编写的正则表达式函数库 由菲利普 海
  • SDIO接口(2)——SD卡寄存器

    1 SD卡寄存器 SDIO接口中定义了8个寄存器 OCR CID CSD RCA DSR SCR SSR 仅sdio卡支持 CSR 仅sdio卡支持 这些寄存器只能通过对应的命令访问 其中OCR CID CSD SCR寄存器保存了卡 内容的
  • 聚类效果评价——Davies-Bouldin(DB指标)——内部评估标准(3)

    Davies David L and Donald W Bouldin A cluster separation measure IEEE transactions on pattern analysis and machine intel
  • Sql日志

    sql日志是为了记录一些之前的所有操作 一般是为了查看一些误操作之前的操作是什么 便于维护 node中常用的日志库是log4js 写好日志配置 专门写在一个文件中 导出日志对象 一个日志类别就是一个对象 const log4js requi
  • Error: Can‘t find Python executable “python“, you can set the PYTHON env variable.解决办法

    电脑磕坏了 最近把公司给的mac屏幕给磕坏了 换成自己的macbookpro 本来想用时间机器做个无缝衔接 结果发现不能用了 跟客服沟通被告知macos版本在11以上不支持时间机器系统迁移 只能使用迁移助理做数据备份 非常痛苦 要重新安装各
  • 图形类设计——c++圆、矩形、三角形类的设计

    题目要求 设计三个图形类 Circle 圆 Rectangle 矩形 Triangle 三角形 1 Cirlce 类基本信息 圆心坐标 半径 Rectangle 类基本信息 长 宽 Triangle 类基本信息 三个顶点坐标 其中 成员变量
  • 排查Linux机器是否已经被入侵

    随着开源产品的越来越盛行 作为一个Linux运维工程师 能够清晰地鉴别异常机器是否已经被入侵了显得至关重要 个人结合自己的工作经历 整理了几种常见的机器被黑情况供参考 背景信息 以下情况是在CentOS 6 9的系统中查看的 其它Linux
  • 基于Yolov5环境配置详解(真的很方便很简单)

    目录 前言 写在前面 很重要 本文相应版本 一 查看CUDA 二 安装Anaconda 三 安装Pytorch环境 五 安装Pycharm 六 验证Pytorch 七 下载Yolov5 5 0源码和权重文件 八 安装Microsoft C
  • 祝贺姜宁当选 2022 Apache 软件基金会新任董事

    近日 Apache 软件基金会通过官方 blog 向大家公布了新一任董事的选举成果 在这周 Apache 软件基金会 下称 ASF 举行了一年一度的成员会议 并选举出了新的董事会 Rich Bowen 原董事 Bertrand Delacr
  • tftp服务器上传文件至华三ac,H3C命令行怎样实现TFTP呢【已解决】~

    设备基本配置 interface Ethernet0 0 用于连接client 的接口地址 port link mode route ip address 10 0 0 1 255 255 255 0 3 操作步骤 1 确认设备FTP功能使
  • 电子电路基础 (10)——场效应管的构造原理及使用

    一 场效应管的构造以及认识 非常重要 两只半引脚的 上面的是散热 和中间的半只引脚连在一起的 1 1 场效应管的构造 场效应管简称FET 与三极管一样也分三个极 其中D极称为漏极 也称为供电极 S极为源极 也称输出极 G极为栅极或称闸极 也
  • activiti实战系列 并行网关(parallelGateWay)

    流程图 13 2 部署流程定义 启动流程实例 13 3 查询我的个人任务 13 4 完成我的个人任务 说明 1 一个流程中流程实例只有1个 执行对象有多个 2 并行网关的功能是基于进入和外出的顺序流的 分支 fork 并行后的所有外出顺序流
  • eigen 总结(一)

    参考 https blog csdn net u012936940 article details 79706280 Matrix 类 Matrix
  • 前端vue uni-app自定义精美海报生成组件

    前端Vue Uni App自定义精美海报生成组件的技术实现 在当前软件开发中 随着技术的不断发展 软件开发的复杂度也在不断提高 为了解决这个问题 组件化开发逐渐成为了一种趋势 通过组件化开发 我们可以实现单独开发 单独维护 并且组件之间可以
  • java代码规范检查(遵循阿里巴巴开发)

    java代码规范检查 遵循阿里巴巴开发 基于代码的部署 后期测试与维护 需要对代码进行检查 在这里遵循阿里巴巴集团的开发规范 有兴趣的可以去参考阿里巴巴出版的一本书 阿里巴巴Java开发手册 eclipse安装代码规范检查插件 环境 JDK
  • 如何使用nuget中的FastReport.Core库

    https www cnblogs com wxchuachua p 10167508 html 下载FastReport Net最新版本 FastReport Net 2018新功能之一 使用nuget数据包 要安装软件包 必须创建一个本
  • c/c++将tuple展开/解包到不定参数列表中

    目录 问题引入 问题提出 引入templete lt size t Is gt 模板 获取不定参数模板的索引模板 问题引入 现在想实现这样一个模板类 将不定参通过commit函数提交到工作队列 然后由一个线程从队列中取出数据 调用proce