提问人:gonidelis 提问时间:8/14/2023 最后编辑:gonidelis 更新时间:8/15/2023 访问量:41
函数参数包专用化
Function parameter pack specialization
问:
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
归根结底,这两种情况都适用于隐式推导。显式指定参数只会使编译器更容易。
对于将其标记为重复的人,如果存在类似的东西,我不是在谈论“正常参数”。此外,我不是在问我是否可以在参数表之前放置参数包,我是在问为什么当包在参数列表中排在第一位时我不能显式指定模板参数。
答:
0赞
Brian Bi
8/15/2023
#1
参数包是“贪婪的”,因此当您先将模板参数指定为 ,然后显式指定为 时,该参数包会吞噬所有指定的参数,即 is 和 尚未指定。 是从第一个参数的类型推导出来的,但这意味着 has parameter-type-list 的结果声明,因为 被推导了,但被显式指定了 。因此,这种特殊的专业化需要 3 个参数,但您只提供了 2 个参数。Ts
int, char
Ts
int, char
T
T
bar
int, int, char
int
T
int, char
Ts
bar
下一个:C++ 类型与非类型模板演绎问题
评论
bar<char>(1, 'c');
也有效。Ts...
是“贪婪的”,所以你不能指定,必须推导出来。T
T
template<..>
f(Ts... non deducibles, T)
g(T, Ts... deducible)