函数参数包专用化

Function parameter pack specialization

提问人:gonidelis 提问时间:8/14/2023 最后编辑:gonidelis 更新时间:8/15/2023 访问量:41

问:

template <typename T, typename ... Ts>
void foo(T , Ts ... )
{
}

template <typename ... Ts, typename T>
void bar(T , Ts ... )
{
}

int main()
{
  foo<int, char>(1, 'c'); // well formed
  foo(1, 'c');

  // bar<int, char>(1, 'c'); // ill formed
  bar(1, 'c');
}

为什么在第二种情况下显式专用化模板参数函数不起作用()?很明显,原因是参数包在参数列表中排在第一位,但仍然......为什么?bar

归根结底,这两种情况都适用于隐式推导。显式指定参数只会使编译器更容易。

对于将其标记为重复的人,如果存在类似的东西,我不是在谈论“正常参数”。此外,我不是在问我是否可以在参数表之前放置参数包,我是在问为什么当包在参数列表中排在第一位时我不能显式指定模板参数。

C++ variadic-templates 模板参数演绎

评论

0赞 Sam Varshavchik 8/14/2023
只有当可变参数是最后一个参数时,您才能推断出该参数。请参阅链接的问题。
1赞 gonidelis 8/14/2023
在这两种情况下,variadic 参数都是最后一个参数。@SamVarshavchik
1赞 Jarod42 8/14/2023
bar<char>(1, 'c');也有效。
1赞 Jarod42 8/14/2023
Ts...是“贪婪的”,所以你不能指定,必须推导出来。TT
1赞 Jarod42 8/14/2023
@SamVarshavchik:顺序in对于推导可能性并不重要,它是函数参数/中的顺序。template<..>f(Ts... non deducibles, T)g(T, Ts... deducible)

答:

0赞 Brian Bi 8/15/2023 #1

参数包是“贪婪的”,因此当您先将模板参数指定为 ,然后显式指定为 时,该参数包会吞噬所有指定的参数, is 和 尚未指定。 是从第一个参数的类型推导出来的,但这意味着 has parameter-type-list 的结果声明,因为 被推导了,但被显式指定了 。因此,这种特殊的专业化需要 3 个参数,但您只提供了 2 个参数。Tsint, charTsint, charTTbarint, int, charintTint, charTsbar