gpt4 book ai didi

c++ - 这段代码如何从元组中提取参数?

转载 作者:行者123 更新时间:2023-11-28 02:43:21 27 4
gpt4 key购买 nike

因此,我一直面临将可变参数存储在元组中以便稍后使用这些参数调用函数的问题。我通过 Kerrek SB 找到了答案这做得很好,但我不明白它到底做了什么。这是代码:

// implementation details, users never invoke these directly
namespace detail
{
template <typename F, typename Tuple, bool Done, int Total, int... N>
struct call_impl
{
static void call(F f, Tuple && t)
{
call_impl<F, Tuple, Total == 1 + sizeof...(N), Total, N..., sizeof...(N)>::call(f, std::forward<Tuple>(t));
}
};

template <typename F, typename Tuple, int Total, int... N>
struct call_impl<F, Tuple, true, Total, N...>
{
static void call(F f, Tuple && t)
{
f(std::get<N>(std::forward<Tuple>(t))...);
}
};
}

// user invokes this
template <typename F, typename Tuple>
void call(F f, Tuple && t)
{
typedef typename std::decay<Tuple>::type ttype;
detail::call_impl<F, Tuple, 0 == std::tuple_size<ttype>::value, std::tuple_size<ttype>::value>::call(f, std::forward<Tuple>(t));
}

基本上,让我感到困惑的部分是以下部分:

template <typename F, typename Tuple, bool Done, int Total, int... N>
struct call_impl
{
static void call(F f, Tuple && t)
{
call_impl<F, Tuple, Total == 1 + sizeof...(N), Total, N..., sizeof...(N)>::call(f, std::forward<Tuple>(t));
}
};

我知道有某种 TMP 递归与 N...sizeof...(N),它以具有 的部分特化停止>Done 设置为 true,当条件 Total == 1 + sizeof...(N) 被验证时发生。

我无法理解的是这个N... 是从哪里来的。我看不到它从哪里开始...

有人可以解释一下这个实现是如何工作的吗? (如果这不是 SO 的主题)。

最佳答案

第一次调用:

typedef typename std::decay<Tuple>::type ttype;
detail::call_impl<
F, Tuple, 0 == std::tuple_size<ttype>::value, std::tuple_size<ttype>::value
>::call(f, std::forward<Tuple>(t));

请注意,它们将 4 个参数传递给 call_impl

<typename F, typename Tuple, bool Done, int Total, int... N>
struct call_impl

在这里您可以看到它需要 4 个参数,然后是 int...int... 表示“零个或多个 int”。所以它以零 int 开头。

但是 Done 为假,除非 ttype 为空。

如果 Done 为 false,则使用基础实例:

call_impl<F, Tuple, Total == 1 + sizeof...(N), Total, N..., sizeof...(N)>::call(f, std::forward<Tuple>(t));

最初 N... 是空的,所以 sizeof...(N)0。这这结束了

call_impl<F, Tuple, Total == 1 + 0, Total, 0>::call(f, std::forward<Tuple>(t));

0 填充 N...Done 设置为 true iff Total==1。如果不是,我们递归,并最终将 N... 设置为 0,1,重复直到 Done。一旦 Done 为真,我们就有一个 N... 填充了 0, 1, 2, ... 直到 Total-1.

Done 为真会导致调用此特化:

template <typename F, typename Tuple, int Total, int... N>
struct call_impl<F, Tuple, true, Total, N...>

谁做的电话。

现在,这是一种奇怪而笨拙的技术,您可以根据 Total 构建该序列,然后将包含该序列的类型作为参数传递给函数,并推导出序列出来的类型。但上述技术有效。

关于c++ - 这段代码如何从元组中提取参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25206821/

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