代码之家  ›  专栏  ›  技术社区  ›  Michal

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

  •  1
  • Michal  · 技术社区  · 2 年前

    我想创建一个 std::index_sequence 其保持给定数量的倍数。

    比方说,我想保持这样的价值观 0, 3, 6, 9, ... 0, 2, 4, 6, 8, 10, ... .

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

    我想通过给定要生成的值的数量以及在连续值之间的步长来使用它。

    1 回复  |  直到 2 年前
        1
  •  4
  •   Ted Lyngmo    2 年前

    我会使用一个“正常”的索引序列,并将其乘以 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>{}));