使用自定义值编译时 std::index_sequence

Mic*_*hal 2 c++ templates c++17

我想创建一个std::index_sequence包含给定数字的倍数的对象。

假设我想保存类似0, 3, 6, 9, ...or的值0, 2, 4, 6, 8, 10, ...

如何创建这样的自定义序列?

我想通过给出要生成的值的数量并在连续值之间步进来使用它。

Ted*_*gmo 5

我将使用“正常”索引序列并将其乘以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)

  • 修复类型与函数的问题并不难`使用 make_index_sequence_as_multiple_of = decltype([]{ ...相同的主体... }());` (2认同)