Mic*_*hal 2 c++ templates c++17
我想创建一个std::index_sequence包含给定数字的倍数的对象。
假设我想保存类似0, 3, 6, 9, ...or的值0, 2, 4, 6, 8, 10, ...。
如何创建这样的自定义序列?
我想通过给出要生成的值的数量并在连续值之间步进来使用它。
我将使用“正常”索引序列并将其乘以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>{});
}
Run Code Online (Sandbox Code Playgroud)
示例:您可以创建一个由 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)>);
}
Run Code Online (Sandbox Code Playgroud)
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>{});
}
Run Code Online (Sandbox Code Playgroud)
如果您想要类型而不是对象,您可以隐藏创建并使用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>{}));
Run Code Online (Sandbox Code Playgroud)