如何为模板参数包指定默认参数?
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{});
};
到目前为止已经有两个很好的答案(包括 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>>;
// ...
};
我有以下方法
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{});
};
到目前为止已经有两个很好的答案(包括 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>>;
// ...
};