使用std :: index_sequence的默认参数

时间:2016-10-19 12:02:50

标签: c++ templates c++14 variadic-templates index-sequence

我很难理解以下内容。为什么这段代码编译

template <size_t N, size_t... N_i, size_t... M_i>
auto foo2(std::index_sequence<M_i...> = std::make_index_sequence<N>())
{

    constexpr size_t values[] = {N_i...};
    return A<values[M_i]...>();
}


template <size_t N,size_t... N_i>
auto foo()
{
    return foo2<N,N_i...>(std::make_index_sequence<N>());
}


int main()
{
 foo<2, 1,2,3>();
}

但这不是(我使用默认参数foo2):

template <size_t N, size_t... N_i, size_t... M_i>
auto foo2(std::index_sequence<M_i...> = std::make_index_sequence<N>())
{

    constexpr size_t values[] = {N_i...};
    return A<values[M_i]...>();
}


template <size_t N,size_t... N_i>
auto foo()
{
    return foo2<N,N_i...>();
}


int main()
{
 foo<2, 1,2,3>();
}

非常感谢提前。

1 个答案:

答案 0 :(得分:4)

假设:

template <size_t N, size_t... N_i, size_t... M_i>
auto foo2(std::index_sequence<M_i...> = std::make_index_sequence<N>());

您无法明确指定M_i(因为序列只会被N_i的一部分吞没)。如果指定参数,则编译器可以使用模板参数推导来计算出M_i是什么。如果你没有指定一个参数,那么编译器无法推断出M_i是什么(并且它需要知道它才能开始决定你需要一个默认参数,并且那个论点是什么。)

假设这是较大整体的一小部分,那么修复就是写

template <size_t N, size_t... N_i, size_t... M_i>
auto foo2(std::index_sequence<M_i...>)
{

    constexpr size_t values[] = {N_i...};
    return A<values[M_i]...>();
}


template <size_t N,size_t... N_i>
auto foo2()
{
    return foo2<N,N_i...>(std::make_index_sequence<N>());
}

然后你确实可以写:

template <size_t N,size_t... N_i>
auto foo()
{
    return foo2<N,N_i...>();
}