因此,我一直面临将可变参数存储在元组中以便稍后使用这些参数调用函数的问题。我通过 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...
Và sizeof...(N)
,它以具有 的部分特化停止>Done
đặt thành ĐÚNG VẬY
,当条件 Total == 1 + sizeof...(N)
被验证时发生。
我无法理解的是这个N...
是从哪里来的。我看不到它从哪里开始...
有人可以解释一下这个实现是如何工作的吗? (如果这不是 SO 的主题)。
第一次调用:
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
构建该序列,然后将包含该序列的类型作为参数传递给函数,并推导出序列出来的类型。但上述技术有效。
Tôi là một lập trình viên xuất sắc, rất giỏi!