【问题标题】:Deduce parameter pack from default argument从默认参数推导出参数包
【发布时间】: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_sequencestd::make_integer_sequence
  • @IgorTandetnik 问题是我在 msvc 中看不到 std::make_integer_sequence 的定义(它使用类似 __make_integer_seq&lt;integer_sequence, _Ty, _Size&gt;; 的东西),但我想我还是应该使用它。就模板化 lambda 而言,似乎预览 msvc 版本 + 语言标准设置为 latest 允许这些,所以我可以使用它在我的其他函数中创建一个辅助 lambda 函数。

标签: c++ c++17 variadic-templates template-meta-programming template-argument-deduction


【解决方案1】:

编译器是否可以从函数的默认参数中推导出参数包?

没有,据我所知。

但是......不完全是你问的......但也许你会发现以下基于结构部分专业化的解决方案很有用

template <std::size_t N, typename = std::make_index_sequence<N*N>>
struct deduceParamPackStruct;

template <std::size_t N, std::size_t ... Is>
struct deduceParamPackStruct<N, std::index_sequence<Is...>>
 {
   static constexpr std::size_t func ()
    { return sizeof...(Is); }
 };

你可以如下使用它

static_assert( 25 == deduceParamPackStruct<5>::func() );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-18
    • 2020-02-27
    • 1970-01-01
    • 2021-12-27
    • 2023-01-24
    • 2021-05-28
    • 2015-05-19
    相关资源
    最近更新 更多