gpt4 book ai didi

c++ - 你能反转初始化列表中参数扩展的顺序吗?

转载 作者:行者123 更新时间:2023-12-05 09:32:46 26 4
gpt4 key购买 nike

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

template<typename... Args>
[[nodiscard]] inline std::tuple<Args...> popTupleFromStack(Stack& stack)
{
return { stack.Pop<Args>()... };
}

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

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

我的结束是为元组中的潜在参数数量手动指定重载:

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,如果它有任何不同的话,我可以使用)。

最佳答案

之后你可以反转元组

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

关于c++ - 你能反转初始化列表中参数扩展的顺序吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67660638/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com