社区首页 >问答首页 >你能颠倒初始化器列表中参数展开的顺序吗?

你能颠倒初始化器列表中参数展开的顺序吗?
EN

Stack Overflow用户
提问于 2021-05-23 14:07:34
回答 2查看 61关注 0票数 2

我正在编写一种自定义解释语言,它使用后进先出堆栈进行数据操作。在两个地方,我需要能够从存储在堆栈上的值构造一个元组。原则上,此代码将如下所示:

代码语言:javascript
代码运行次数:0
复制
template<typename... Args>
[[nodiscard]] inline std::tuple<Args...> popTupleFromStack(Stack& stack)
{
    return { stack.Pop<Args>()... };
}

但是,栈的后进先出顺序有一个基本问题:初始化器列表顺序指示调用从左到右发生,这意味着它实际上会尝试以完全相反的顺序弹出元素。有什么简单的方法可以颠倒这个顺序吗?

我知道折叠表达式允许您指定向左或向右折叠,但当您需要使用结果初始化对象时,似乎不能使用折叠表达式。

我的闭包是手动指定元组中可能的参数数量的重载:

代码语言:javascript
代码运行次数:0
复制
template<typename Arg0>
[[nodiscard]] inline std::tuple<Arg0> popStackTuple(Stack& stack)
{
    return { stack.Pop<Arg0>() };
}

template<typename Arg0, typename Arg1>
[[nodiscard]] inline std::tuple<Arg0, Arg1> popStackTuple(Stack& stack)
{
    Arg1 arg1 = stack.Pop<Arg1>();
    Arg0 arg0 = stack.Pop<Arg0>();

    return { arg0, arg1 };
}

但这显然限制了我可以支持的参数数量,并且/或者导致了许多“不必要的”代码。用现代的C++做不到这似乎是一件微不足道的事情(我已经准备好了所有的东西,如果有什么不同的话,包括C++20 )。

EN

回答 2

Stack Overflow用户

发布于 2021-05-23 14:15:16

之后,您可以反转元组

代码语言:javascript
代码运行次数:0
复制
template <std::size_t ... Is, typename Tuple>
auto reverse_tuple_impl(std::index_sequence<Is...>, Tuple& tuple)
{
    using res_type = std::tuple<std::tuple_element_t<sizeof...(Is) - 1 - Is, std::decay_t<Tuple>>...>;
Is, std::decay_t<Tuple>>>;
    return res_type(std::get<sizeof...(Is) - 1 - Is>(tuple)...);
}

template <typename ... Ts>
auto reverse_tuple(std::tuple<Ts...>& tuple)
{
    return reverse_tuple_impl(std::index_sequence_for<Ts...>(), tuple);
}

Demo

票数 6
EN

Stack Overflow用户

发布于 2021-05-23 15:45:13

不是很大的进步但是..。如果可以使用C++20,那么可以将帮助函数嵌入到reverse_tuple()

代码语言:javascript
代码运行次数:0
复制
template <typename ... Ts>
auto reverse_tuple (std::tuple<Ts...> & tuple)
 {
   return [&]<std::size_t ... Is> (std::index_sequence<Is...>)
      { return std::make_tuple(std::get<sizeof...(Is)-1u-Is>(tuple)...); }
    (std::index_sequence_for<Ts...>{});
 }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67660638

复制
相关文章
【java基础☞初始化顺序】java继承中的初始化顺序
1、初始化顺序:父类的静态变量-->父类的静态代码块-->子类的静态变量-->子类的静态代码快-->父类的非静态变量(父类的非静态代码块)-->父类的构造函数-->子类的非静态变量(子类的非静态代码块)-->子类的构造函数
用户5640963
2019/07/25
1K0
Java 中构造器、初始化块、静态初始化块的执行顺序
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/147249.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/01
5010
Java中变量的初始化顺序
在写一个通用的报警模块时,遇到一个有意思的问题,在调用静态方法时,发现静态方法内部对静态变量引用时,居然抛出了npe,仿佛是因为这个静态变量的初始化在静态方法被调用时,还没有触发,从而导致这个问题,因此今天专门来学习下静态成员的初始化顺序,以及上面这个问题导致的原因
一灰灰blog
2022/01/17
1.2K0
Java中变量的初始化顺序
你能发现这段 Python 代码中的 bug 吗?
原文链接:https://dwrodri.gitlab.io/can-you-spot-the-bug-in-this-python-code/
腾讯云 CODING
2023/08/18
1360
你能发现这段 Python 代码中的 bug 吗?
你能发现这段 Python 代码中的 bug 吗?
原文链接:https://dwrodri.gitlab.io/can-you-spot-the-bug-in-this-python-code/
腾讯云 CODING
2023/08/17
2060
你能发现这段 Python 代码中的 bug 吗?
【C++】构造函数初始化列表 ② ( 构造函数 为 初始化列表 传递参数 | 类嵌套情况下 的 构造函数 / 析构函数 执行顺序 )
在下面的代码中 , B 类的 有参构造函数 , 传入了 3 个参数 , 这三个参数都不在函数体中使用 , 而是在 参数列表中使用 ,
韩曙亮
2023/10/15
2630
【C++】构造函数初始化列表 ② ( 构造函数 为 初始化列表 传递参数 | 类嵌套情况下 的 构造函数 / 析构函数 执行顺序 )
AS3.0中类初始化的顺序
父类--静态变量 子类--静态变量 父类--变量 父类--构造器 子类--变量 子类--构造器
meteoric
2018/11/15
6790
Python 嵌套列表展开
问题1:对于列表形如 list_1 = [[1, 2], [3, 4, 5], [6, 7], [8], [9]] 转化成列表 list_2 = [1, 2, 3, 4, 5, 6, 7, 8, 9] 的问题。
py3study
2020/01/08
3K0
顺序OleDbCommand命名参数,你了解不?
接触到一个老的项目,里面大量使用OleDbConnection进行数据库操作,在执行SQL块语句时,对它的顺序参数、命名参数很不了解。据说不能使用命名参数,但我这里试验了一下,好像是可以的,只是对参数的顺序还是有要求。看看你能知道下面的输出结果吗?
全栈程序员站长
2022/08/31
4140
Java类的初始化顺序_java静态类初始化顺序
类变量先分配内存并且赋值为默认值,再进行初始化。类变量和对象变量初始化顺序都为从上到下初始化,有变量初始化,代码块初始化,构造器初始化
全栈程序员站长
2022/09/22
7320
这个坑你能填吗?
今天利用java发邮件,本地windows上测试时发送ok的,部署到服务器上却报异常,让我们走进异常,探索到底坑在哪里,并填之。
我的小碗汤
2018/08/22
9230
这个坑你能填吗?
这个问题你能答对吗?
首先,还是给大家说声抱歉,由于微信限制,前两天抽奖的好友请求还没有全部通过验证,这两天都会通过并拉大家进抽奖群的,还请大家海涵。
我的小碗汤
2018/08/22
5930
这个问题你能答对吗?
python进阶-嵌套列表展开
本文讲解的是一个Python的进阶知识点:**如何将一个嵌套的大列表展开形成一个大列表。
皮大大
2023/08/25
3600
python进阶-嵌套列表展开
Python的列表怎么用?你会用吗?
同学们,欢迎来到马哥教育官网!Python的列表怎么用?你会用吗?本文主要介绍了Python中列表(List)的详解操作方法,包含创建、访问、更新、删除、其它操作等,需要的朋友可以参考下。 1.创建
小小科
2020/06/03
9380
学你的课能发文章吗?
所以现在站长终于敢回答,很多还没有加入星球的学员那句话“学你的课程能发文章吗?”可以~
Chris生命科学小站
2023/03/02
5550
学你的课能发文章吗?
【C++】构造函数初始化列表 ③ ( 构造函数 的 初始化列表 中 为 const 成员变量初始化 )
如果 类 中定义了 被 const 修饰 的 成员变量 , 那么该成员变量 必须被初始化 , 否则会报错 ;
韩曙亮
2023/10/15
2430
【C++】构造函数初始化列表 ③ ( 构造函数 的 初始化列表 中 为 const 成员变量初始化 )
Es6参数展开&剩余参数
Es6中我们可以通过...+变量的方式存储函数剩余的参数,该变量是包含剩余参数的数组
切图仔
2022/09/08
7020
Es6参数展开&剩余参数
SpringBean初始化顺序
Spring bean是Spring框架在运行时管理的对象。Spring bean是任何Spring应用程序的基本构建块。我们编写的大多数应用程序逻辑代码都将放在Spring bean中。
代码的路
2023/09/06
1660
SpringBean初始化顺序
分页列表缓存,你真的会吗
开源中国的红薯哥写了很多关于缓存的文章,其中多级缓存思路,分页列表缓存这些知识点给了我很大的启发性。
勇哥java实战
2023/05/23
8680
分页列表缓存,你真的会吗
Java初始化顺序
作者:wota 来源:http://www.cnblogs.com/miniwiki/archive/2011/03/25/1995615.html(点击文末阅读原文前往) 1 无继承情况下的Java初始化顺序: class Sample { Sample(String s) { System.out.println(s); } Sample() { System.out.println("Sample默认
java达人
2018/01/31
6190
Java初始化顺序

相似问题

你能颠倒布兰卡彩色地图的顺序吗?

25

你能改变JMenuItems的顺序吗?

14

你能改变Jira中字段的顺序吗?

20

颠倒列表的顺序

40

你能改变R中TukeyHSD的顺序吗?

113
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文