我会使用一个“正常”的索引序列,并将其乘以
M
如下所示:
template <std::size_t M, std::size_t N>
auto make_index_sequence_as_multiple_of() {
return []<std::size_t... I>(std::index_sequence<I...>) {
return std::index_sequence<(I * M)...>{};
}(std::make_index_sequence<N>{});
}
示例:您可以创建一个由5个索引组成的序列,作为3的倍数,如下所示:
int main() {
auto is = make_index_sequence_as_multiple_of<3, 5>();
static_assert(
std::is_same_v<std::index_sequence<0, 3, 6, 9, 12>, decltype(is)>);
}
C++20之前的版本:
namespace detail {
template<std::size_t M, std::size_t... I>
auto helper(std::index_sequence<I...>) {
return std::index_sequence<(I * M)...>{};
}
} // namespace detail
template <std::size_t M, std::size_t N>
auto make_index_sequence_as_multiple_of() {
return detail::helper<M>(std::make_index_sequence<N>{});
}
如果你想要
类型
您可以隐藏创建并使用
decltype
找出类型。以下是C++20之前的版本:
namespace detail {
template <std::size_t M, std::size_t... I>
auto helper(std::index_sequence<I...>) {
return std::index_sequence<(I * M)...>{};
}
} // namespace detail
template <std::size_t M, std::size_t N>
using make_index_sequence_as_multiple_of =
decltype(detail::helper<M>(std::make_index_sequence<N>{}));