如何按索引从可变参数模板参数包中提取值?

2023-12-27

我想写一个函数magic_get,它可以通过索引从参数包中提取值,例如:

int n = 0;
n = magic_get<0>(1, 3, 5, 7);
assert(1 == n);
n = magic_get<1>(1, 3, 5, 7);
assert(3 == n);
n = magic_get<2>(1, 3, 5, 7);
assert(5 == n);
n = magic_get<3>(1, 3, 5, 7);
assert(7 == n);

如何实施magic_get?


template <size_t N, typename... Args>
decltype(auto) magic_get(Args&&... as) noexcept {
    return std::get<N>(std::forward_as_tuple(std::forward<Args>(as)...));
}

Change decltype(auto) to auto并添加尾随返回类型decltype(/* the whole returned expression here */)如果 C++14 功能不可用。


无元组版本:

template <std::size_t N, typename Tfirst, typename... Args, std::enable_if_t<N == 0, int>...>
decltype(auto) magic_get(Tfirst&& first, Args&&... as) noexcept {
    return std::forward<Tfirst>(first);
}

template <std::size_t N, typename Tfirst, typename... Args, std::enable_if_t<N != 0, int>...>
decltype(auto) magic_get(Tfirst&& first, Args&&... as) noexcept {
    return magic_get<N - 1>(std::forward<Args>(as)...);
}

请注意,这在 clang 中不起作用,感谢铿锵错误 11723 http://llvm.org/bugs/show_bug.cgi?id=11723。更换std::enable_if_t<N != 0, int>... with std::enable_if_t<N != 0, int> = 0是一个简单的解决方法。

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

如何按索引从可变参数模板参数包中提取值? 的相关文章

随机推荐

  • Android contextmenu项目大小/高度,如何更改?

    如何更改上下文菜单项的大小 高度 谢谢 莱斯利 它并不是真的要修改 它是为了以标准方式处理菜单 有一些方法可以修改菜单及其项目 例如 请参见此处 http www techjini com blog 2011 04 19 customizi
  • 如何在没有CLR的情况下调试SQL Server 2008中的存储过程?

    如何在 SQL Server 2008 Management Studio 中调试存储过程 我试图在 SQL 查询上设置断点 然后按开始调试 但出现错误 无法在我的计算机上启动调试 Debug cannot be started at
  • 在 Python 中使用递归和 Yield 语句生成幂集

    我对 Python 有点陌生 正在进行编程练习 我编写了以下递归方法来生成电源组 https en m wikipedia org wiki Power set基于 Python 中的输入列表 它应该返回一个生成器 该生成器生成传入的给定列
  • 如何在Java中实现类似C#的语言级别事件

    C 有这样的概念语言层面的事件 http msdn microsoft com en us library awbftdfh aspx 使用保留关键字event and delegate定义发布者和订阅者方法 它一直询问 Java 是否对此
  • 有什么办法可以改变视频的质量吗?

    我正在查看 android youtube API 文档和示例应用程序 我找不到任何描述加载视频并设置其质量 低或高 的 API 有没有办法改变视频的质量 Android youtube api https developers googl
  • 更新 xml 文件中的值

    我有一个 xml 文件
  • 在 Makefile 中打印:@echo 与 $(info )

    makefile 中这两个命令有什么区别 echo Hello World info Hello World 看起来 echo and info打印相同的输出 那么差异在哪里呢 以及何时使用哪一个 Well echo是一个 shell 命令
  • CreateProcess error = 2,系统找不到指定的文件错误

    我在 Windows 上安装了 Android Studio 2 3 3 在 Windows 上也安装了 Git 我从 GitHub 克隆了一个存储库 VCS gt 从版本控制中签出 gt Git gt 粘贴链接 并尝试运行它 但是 gra
  • Java 的 Yacc 等效项

    我正在开发一个 Java 编译器设计项目 词法分析已经完成 使用 jflex 我想知道哪种类似 yacc 的工具最适合进行语法分析 最有效 最容易使用等 以及原因 如果你特别想要类似 YACC 的行为 表驱动 我知道的唯一一个是CUP ht
  • Android应用程序的包名应该是什么?

    我想知道android应用程序的包名应该是什么 意味着通常我们使用 com appname 或 com organizationName appName 但是当我们将应用程序提交到市场时 有时会显示与包名称相关的错误 请更改包名称 它不应该
  • 如何在java中计算逆累积贝塔分布函数

    我正在寻找一个java库 实现 它支持计算beta分布的逆累积分布函数 又名分位数估计 具有合理的精度 当然我已经尝试过了阿帕奇公共数学 http commons apache org math 但是在版本3中似乎仍然有一些精度问题 htt
  • 如何使用参数化参与者在akka中创建路由器?

    我正在尝试在 Scala 中使用广播路由器 如果我没有记错的话 它应该如下所示 val system ActorSystem My beautiful system val workerRouter system actorOf Props
  • ASP.NET MVC 遇到问题?沮丧的

    我对 ASP NET MVC html 帮助程序 如 TextBoxFor HiddenFor 等 有问题 如果我有一个模型 如带有字符串成员 Name 的 Employee 并执行 Html TextBoxFor p gt p Name
  • Qt5.3 中 OpenGL 渲染之上的 QML UI

    我正在尝试在 Qt5 3 上的 openGL 渲染之上渲染 QML UI 到目前为止 QML 小部件具有黑色背景 而我希望有一个透明背景 我将代码展开在一个文件中 以便更容易阅读和编译 include
  • 比较整数和整数还是字符串和字符串更有效

    我有一个用 C 编写的程序 其中有很多整数和字符串之间的比较 所以出于性能原因 我只想知道哪个更有效率 如果我们有 int a 5 string b 5 if a int Parse b OR if a ToString b 我实际上使用一
  • ServiceStack 的路由路径

    我正在使用 AngularJS 我想在 ServiceStack serving static html 上执行以下路由 请注意拦截任意路径在屏幕截图上 另请注意 我没有将 ServiceStack 用于 REST 而是将其用作纯 Web
  • 在 C++ 中显示字符串向量

    如果这是一个重复的问题 我很抱歉 但我已经尝试寻找答案但空手而归 所以基本上我只想将字符串 单个单词 添加到向量的后面 然后将存储的字符串显示为单个字符串 我真是个菜鸟 include
  • 在 Mahapps.Metro 中设置 WindowButtonCommands 样式

    我想更改 WPF 应用程序的 最小 最大 和 关闭 按钮的样式 我在用着Mahapps Metro https github com MahApps MahApps Metro我已经成功地实现了我想要的结果 但只有过时的WindowMinB
  • 使用接口将数据从片段/活动传递到片段/活动的命名技术

    在学校 我们现在正在学习如何通过使用接口使片段更加通用 这项技术仍然有点抽象 我真的不知道何时 如何使用它 任何人都可以向我指出一些有关如何使用该技术的资源 可以称为接口回调吗 非常感谢所有帮助 The 回调方法 正如你所说的 就像List
  • 如何按索引从可变参数模板参数包中提取值?

    我想写一个函数magic get 它可以通过索引从参数包中提取值 例如 int n 0 n magic get lt 0 gt 1 3 5 7 assert 1 n n magic get lt 1 gt 1 3 5 7 assert 3