如何为模板参数包指定默认参数?

How to specify a default argument for a template parameter pack?

我有以下方法

template <std::size_t N, std::size_t... Indices>
void doSomething()
{
    ...
};

似乎无法为 Indices 提供默认值,例如

template <std::size_t N, std::size_t... Indices = std::make_index_sequence<N>>
void doSomething()
{
    ...
};

编译器抱怨

error: expected primary-expression before '>' token
template <std::size_t N, std::size_t... Indices = std::make_index_sequence<N>>
                                                                             ^~
error: template parameter pack 'Indices' cannot have a default argument
template <std::size_t N, std::size_t... Indices = std::make_index_sequence<N>>
                                    ^~~

有什么解决办法吗?

这是不可能的。但是,您可以用 index_sequence 包装参数包并在函数体中展开它们

#include <cstddef>
#include <utility>

template <std::size_t N, class Indices = std::make_index_sequence<N>>
void doSomething() {
  []<std::size_t... Is>(std::index_sequence<Is...>) {
    // expand parameter pack
  }(Indices{});
};

Demo

到目前为止已经有两个很好的答案(包括 NathanOliver 的评论)。我认为 couple of overloads that act as wrappers 确实是这里最简单的解决方案,但为了完整起见,让我们在一个函数中提供您想要的功能:

通常最好从参数列表中取出尽可能多的模板逻辑(将输入与逻辑分开):

template <std::size_t N, std::size_t... Indices>
void doSomething()
{
    using Ints
        = std::conditional_t<
            /* if */ (sizeof...(Indices) > 0),
                std::index_sequence<Indices...>,
            /* else */
                std::make_index_sequence<N>>;

    // ...
};

demo