将 std::array 拆分为更小的元组 std::array
Spliting a std::array into a tuple of smaller sized std::array
我正在尝试将 std::array<T, N>
拆分为更小数组的元组,例如 std::tuple<std::array<T, N1>, std::array<T, N2>, ...>
其中 N1 + N2 + ... = N.
namespace detail {
// Summation of the given values
template <class T>
constexpr T sum(const T& x) { return x; }
template <class T, class ...Args>
constexpr auto sum(const T& x, Args&&... args)
{ return x + sum(std::forward<Args>(args)...); }
}
template <class T, std::size_t... Ns>
constexpr
std::tuple<std::array<T, Ns>...>
f(const std::array<T, detail::sum(Ns...)>& x)
{
// How do I implement this function?
}
int main()
{
constexpr std::array<Foo, 5> arr = { ... };
constexpr auto t = f<Foo, 2,3>(arr);
}
实际上我已经实现了 f
但它基于一个循环,该循环简单地创建一个空数组并复制给定数组的元素,但如果 T 不是 default_constructible
它就不起作用.
我尝试使用 std::integer_sequence
和 std::make_index_sequence
,但我想我完全迷失了,毫无头绪。
谁能帮我实现这个功能?
写
template<class T,size_t...Is,size_t N>
std::array<T,sizeof...(Is)>
extract(std::array<T,N>const&,std::index_sequence<Is...>){
return {{arr[Is]...}};
}
现在我们只需要粗略地将{1,2,3}
变成{{0},{1,2},{3,4,5}}
,一切都是C++索引序列(语法)。
Map {3,4,0}
to {0,1,2}
-- 子数组索引的计数。然后将 {3,4,0}
x 1
映射到 {3,4,5,6}
并与其他类似。这为我们提供了子数组中的索引,我们将其提供给 extract
并且 bob 是你的叔叔。
template<size_t n, size_t...counts>
constexpr auto
foo( std::index_sequence<counts...> )
-> offset_seq<
sum_n<n>(counts...),
std::make_index_sequence<get_n<n,counts...> >
>{ return {}; }
要编写的各种帮助程序是 {3,4,0}
x 1
到 {3,4,5,6}
部分,例如。
我正在尝试将 std::array<T, N>
拆分为更小数组的元组,例如 std::tuple<std::array<T, N1>, std::array<T, N2>, ...>
其中 N1 + N2 + ... = N.
namespace detail {
// Summation of the given values
template <class T>
constexpr T sum(const T& x) { return x; }
template <class T, class ...Args>
constexpr auto sum(const T& x, Args&&... args)
{ return x + sum(std::forward<Args>(args)...); }
}
template <class T, std::size_t... Ns>
constexpr
std::tuple<std::array<T, Ns>...>
f(const std::array<T, detail::sum(Ns...)>& x)
{
// How do I implement this function?
}
int main()
{
constexpr std::array<Foo, 5> arr = { ... };
constexpr auto t = f<Foo, 2,3>(arr);
}
实际上我已经实现了 f
但它基于一个循环,该循环简单地创建一个空数组并复制给定数组的元素,但如果 T 不是 default_constructible
它就不起作用.
我尝试使用 std::integer_sequence
和 std::make_index_sequence
,但我想我完全迷失了,毫无头绪。
谁能帮我实现这个功能?
写
template<class T,size_t...Is,size_t N>
std::array<T,sizeof...(Is)>
extract(std::array<T,N>const&,std::index_sequence<Is...>){
return {{arr[Is]...}};
}
现在我们只需要粗略地将{1,2,3}
变成{{0},{1,2},{3,4,5}}
,一切都是C++索引序列(语法)。
Map {3,4,0}
to {0,1,2}
-- 子数组索引的计数。然后将 {3,4,0}
x 1
映射到 {3,4,5,6}
并与其他类似。这为我们提供了子数组中的索引,我们将其提供给 extract
并且 bob 是你的叔叔。
template<size_t n, size_t...counts>
constexpr auto
foo( std::index_sequence<counts...> )
-> offset_seq<
sum_n<n>(counts...),
std::make_index_sequence<get_n<n,counts...> >
>{ return {}; }
要编写的各种帮助程序是 {3,4,0}
x 1
到 {3,4,5,6}
部分,例如。