cuốn sách gpt4 ai đã làm

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

In lại Tác giả: Walker 123 更新时间:2023-11-28 02:43:21 27 4
mua khóa gpt4 Nike

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

// implementation details, users never invoke these directly
namespace detail
{
template
struct call_impl
{
static void call(F f, Tuple && t)
{
call_impl::call(f, std::forward(t));
}
};

template
struct call_impl
{
static void call(F f, Tuple && t)
{
f(std::get(std::forward(t))...);
}
};
}

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

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

template 
struct call_impl
{
static void call(F f, Tuple && t)
{
call_impl::call(f, std::forward(t));
}
};

我知道有某种 TMP 递归与 N...sizeof...(N),它以具有 的部分特化停止>Done đặt thành ĐÚNG VẬY,当条件 Total == 1 + sizeof...(N) 被验证时发生。

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

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

câu trả lời hay nhất

第一次调用:

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

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


struct call_impl

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

Nhưng Done 为假,除非 ttype 为空。

nếu như Done 为 false,则使用基础实例:

call_impl::call(f, std::forward(t));

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

call_impl::call(f, std::forward(t));

0 điền vào N.... Done 设置为 true iff Total==1。如果不是,我们递归,并最终将 N... đặt thành 0,1,重复直到 Done。一旦 Done 为真,我们就有一个 N... 填充了 0, 1, 2, ... 直到 Total-1.

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

template 
struct call_impl

谁做的电话。

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

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

27 4 0
Walker 123
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress