【发布时间】:2019-10-20 13:44:16
【问题描述】:
编译器是否可以从函数的默认参数中推断出参数包?特别是,我有以下代码:
template <int ... Is> struct seq {};
template <int ... Is> struct make_seq;
template <int head, int ... tail>
struct make_seq<head, tail...>
{
using type = typename make_seq<head - 1, head - 1, tail...>::type;
};
template <int ... Is>
struct make_seq<0, Is...>
{
using type = seq<Is...>;
};
template <int N>
using make_seq_t = typename make_seq<N>::type;
template<int N, int ...Is>
int deduceParamPack(seq<Is...> s = make_seq_t<N>{})
{
return sizeof...(Is);
}
int main()
{
return deduceParamPack<5>();
}
并且编译器将参数包推断为空,并尝试将默认参数强制转换为它。相反,我想实现类似的行为:
int main()
{
return deduceParamPack<5>(make_seq_t<5>{});
}
推导的参数包是0,1,2,3,4,没有显式传入这个参数。
【问题讨论】:
-
您可以有两个
deduceParamPack的重载,而不是默认参数,一个有参数,一个没有。后者将以适当的默认值调用前者。 -
"编译器是否可以从函数的默认参数中推导出参数包?" - 不,据我所知。
-
@IgorTandetnik 我实际上是在试图避免编写额外的辅助函数——这就是我最初到达那里的方式。前者是由于在 c++17 中无法模板化 lambda。
-
与问题没有直接关系,但请注意您正在重新发明
std::integer_sequence和std::make_integer_sequence -
@IgorTandetnik 问题是我在 msvc 中看不到
std::make_integer_sequence的定义(它使用类似__make_integer_seq<integer_sequence, _Ty, _Size>;的东西),但我想我还是应该使用它。就模板化 lambda 而言,似乎预览 msvc 版本 + 语言标准设置为 latest 允许这些,所以我可以使用它在我的其他函数中创建一个辅助 lambda 函数。
标签: c++ c++17 variadic-templates template-meta-programming template-argument-deduction