gpt4 book ai didi

c++ - 将 int 数组转换为 integer_sequence

转载 作者:行者123 更新时间:2023-12-03 06:50:14 24 4
gpt4 key购买 nike

我想知道是否有办法转换 std::array成索引序列?

constexpr std::array<int, 5> x = {0, 3, 4, 5, 8};

constexpr auto integer_sequence = ...; // something that lead to integer_sequence<int, 0, 3, 4, 5, 8>;
我知道使用一个函数是不可能的,因为它会导致另一种类型。
但是,由于可以执行以下操作:
constexpr std::size_t x = 8;
std::integral_constant<int, x> height;
是否有可能以简单的方式做到这一点?
我尝试执行以下操作:
#include <array>
#include <tuple>

template<std::size_t N>
constexpr std::array<int, N> m_iota(int value) {
std::array<int, N> result{};
for(auto &v : result)
v = value++;
return result;
}

template<int N>
using Int = std::integral_constant<int, N>;

int main() {
constexpr auto array = m_iota<5>(3); // 3, 4, 5, 6, 7
constexpr auto indexer = std::tuple<Int<0>,Int<1>,Int<2>,Int<3>,Int<4>>{};

auto to_sequence = [array](auto ...is) {return std::integer_sequence<int, array[is]...>{};};
auto x = std::apply(to_sequence, indexer);
static_assert(std::is_same_v<decltype(x), std::integer_sequence<int, 3, 4, 5, 6, 7>>);
}
它在 GCC 和 clang 上编译得很好,但在 MSVC 中却没有……有更简单的方法吗?
这里是 msvc 的链接: https://godbolt.org/z/EK7azW

最佳答案

虽然(在 C++17 中)std::array<T>不能是模板参数类型,const std::array<T>&可。因此,有问题的数组具有 的限制静态存储时长 , 你可以写

#include<array>
#include<utility>
#include<type_traits>
#include<cstddef>

template<const auto &A,
class=std::make_index_sequence<
std::tuple_size<std::decay_t<decltype(A)>>::value>>
struct as_sequence;
template<const auto &A,std::size_t ...II>
struct as_sequence<A,std::index_sequence<II...>> {
using type=std::integer_sequence<
typename std::decay_t<decltype(A)>::value_type,A[II]...>;
};

constexpr std::array<int, 5> x = {0, 3, 4, 5, 8};
static_assert(std::is_same_v<as_sequence<x>::type,
std::integer_sequence<int, 0, 3, 4, 5, 8>>);
适用于 every modern compiler .

关于c++ - 将 int 数组转换为 integer_sequence,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64343899/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com